设计模式之Strategy模式
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具体的共同接口的独立类中,从而使得他们可以互相替换。
策略模式使得算法可以在不影响客户端的情况下发生变化。
all in one “准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
三个角色:
环境context角色:持有一个Strategy的引用
策略接口角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
策略角色:包装了相关的算法或行为
环境角色:
package com.yzf.pattern.strategy; /** * 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。 * 在每一个时刻只能使用一个具体的策略实现对象 * @author luozuzu * */ public class Price { //持有一个具体的策略对象 private MemberStrategy memberStrategy; /** * 构造函数,传入一个具体的策略对象 * @param memberStrategy */ public Price( MemberStrategy memberStrategy){ this.memberStrategy = memberStrategy; } public double quote(double price){ return this.memberStrategy.calcPrice(price); } }
接口类:
package com.yzf.pattern.strategy; //策略接口 public interface MemberStrategy { public double calcPrice(double price); }
策略实现类
package com.yzf.pattern.strategy; public class FirstMemberStrategy implements MemberStrategy { //具体策略算法1 public double calcPrice(double price) { System.out.println("对于初级会员的没有折扣"); return price; } }
package com.yzf.pattern.strategy; public class SecondMemberStrategy implements MemberStrategy { //具体策略算法2 public double calcPrice(double price) { System.out.println("对于中级会员的折扣为10%"); return price * 0.9; } }
package com.yzf.pattern.strategy; public class ThirdMemberStrategy implements MemberStrategy { //具体策略算法3 public double calcPrice(double price) { System.out.println("对于高级会员的折扣为20%"); return price * 0.8; } }
客户端
package com.yzf.pattern.strategy; public class Client { public static void main(String[] args) { //MemberStrategy ms = new FirstMemberStrategy(); //MemberStrategy ms = new FirstMemberStrategy(); MemberStrategy ms = new SecondMemberStrategy(); Price p = new Price(ms); double quote = p.quote(300); System.out.println(quote); } }
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。