策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具体的共同接口的独立类中,从而使得他们能够互相替换。算法
策略模式使得算法能够在不影响客户端的状况下发生变化。函数
all in one “准备一组算法,并将每个算法封装起来,使得它们能够互换”。this
三个角色:spa
环境context角色:持有一个Strategy的引用code
策略接口角色:这是一个抽象角色,一般由一个接口或抽象类实现。此角色给出全部的具体策略类所需的接口。对象
策略角色:包装了相关的算法或行为blog
环境角色:接口
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); } }
接口类:class
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); } }
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具备更好的维护性和扩展性。