策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy
与策略相关的常见词汇有:营销策略、折扣策略、教学策略、记忆策略、学习策略....
“策略”意味着分情况讨论,而不是一概而论
面对不同年龄段的人,面对不同的商品,必然将会有不同的话术;
面对购物总价的范围,很可能会有不同的折扣方案;
面对理解能力不同的学生,必然有不同的教学策略;
而在我们程序的世界里,“策略”就是分情况讨论。也就是类似状态模式中的条件分支或者选择分支。
只不过状态模式中是事物的不同状态,而策略模式中关注的是处理方法。
比如
if(totalPrice > 1000){ //9折 else if(totalPrice > 2000){ //8折 }else if(totalPrice > 3000){ //7折 }这就是一种打折策略,对应于购物总金额的不同,采用不同的处理方法。 显然,使用条件分支或者选择语句,类似状态模式中的分析,也存在类似的问题 如果条件过多,会导致处理逻辑复杂 而且,策略的逻辑与业务逻辑耦合在一起,如果处理方法变化还需要修改业务逻辑方法,扩展性差 而且,也不适合增加新的策略方案
意图
定义一系列的算法,把他们一个个的封装起来,并使他们可以互相转换,本模式使得算法可以独立于使用它的客户端而变化。 别名:政策Policy 策略模式与状态模式本质一样,只不过一个是状态,一个是行为算法。结构
抽象策略角色Strategy 定义了抽象的策略,比如打折,排序等 定义了策略的一致性访问接口,比如定义了一个排序接口 sort() 具体策略角色ConcreteStrategy 实现抽象策略的定义的接口,实现自己的行为算法,比如ConcreteStrategyA冒泡 ConcreteStrategyB快排 环境类Context 维护Strategy,持有一个Strategy的引用,用来管理Strategy,可以切换策略 是Strategy的使用者代码示例
排序接口,定义了一个sort方法package strategy; public interface SortStrategy { void sort(); }
package strategy; public class Bubble implements SortStrategy { @Override public void sort() { System.out.println("冒泡排序,输出结果..."); } }
package strategy; public class QuickSort implements SortStrategy { @Override public void sort() { System.out.println("快速排序,输出结果..."); } }环境类 内部持有一个SortStrategy,简单起见初始化为Bubble 使用一个简单的方法进行切换 并且提供sort方法,代理strategy的sort方法
package strategy; public class Context { private SortStrategy strategy = new Bubble(); public void setStrategy(String strategy) { if(strategy.equals("bubble")){ this.strategy = new Bubble(); }else if(strategy.equals("quick")){ this.strategy = new QuickSort(); } } public void sort() { strategy.sort(); } }测试方法
package strategy; public class Test { public static void main(String[] args) { Context context = new Context(); context.sort(); context.setStrategy("quick"); context.sort(); context.setStrategy("bubble"); context.sort(); } }上面的代码可以看得出来,具体的算法行为,被封装在了具体的策略类中,比如Bubble和QuickSort 通过环境类Context对算法进行管理切换。