目录
从UML类图上可以看出,策略模式中主要有3个角色
-
抽象策略接口
上图中的Strategy即抽象策略接口,接口中定义了抽象的策略算法algorithm()。 -
具体的策略实现类
上图中的StrategyA和StrategyB即具体的策略实现。不同的策略实现类都实现了抽象策略接口,并重写了其抽象策略方法。因为都实现了相同的策略接口,因而算法可以相互替换,并且可以动态的改变具体的算法实现。 -
封装策略的上下文环境
上图中的Context即策略的上下文环境。它屏蔽了高层模块对策略算法的直接访问,封装了可能存在的变化。而且提供了修改Strategy的setter方法,可以动态的改变算法的具体实现。
3.策略模式的优点
我们可以结合使用策略模式的例子并与其它实现方案进行对比来看看策略模式到底有什么好处
3.1 一个使用策略模式的例子
定义一个汽车类Car。由于汽车最大的特点是能跑,因而我们赋予该类一个move行为。但要跑起来需要提供能源,通常而言这种能源是汽油,但现在纯靠电池驱动的汽车也越来越多。因而Car的move行为就有两种不同的行为,一种是使用汽油跑,一种是使用电能跑。因而我们可以这么定义
- 抽象的汽车类Car
/** * @author: takumiCX * @create: 2018-10-13 **/ public abstract class Car { //汽车品牌 private String brand; public Car(String brand) { this.brand = brand; } public Car(String brand, MoveStrategy strategy) { this.brand = brand; this.moveStrategy=strategy; } //汽车的运行策略:使用汽油运行,使用电能运行等等 private MoveStrategy moveStrategy; //运行方法 public void move() { System.out.print(brand); moveStrategy.move(); } public void setMoveStrategy(MoveStrategy moveStrategy) { this.moveStrategy = moveStrategy; } }在抽象汽车类中定义了一个move()方法表示汽车具有运行的行为,但是由于到底是使用汽油运行还是使用电能运行并没有直接定义在里面,而是调用了策略接口中定义的move方法。该策略接口以组合的方式封装在Car内部,并提供了setter方法供客户端动态切换汽车的运行方式。
- 使用汽油运行的策略实现
/** * @author: takumiCX * @create: 2018-10-14 **/ /** * 使用汽油运行的策略实现 */ public class GasolineMoveStrategy implements MoveStrategy{ @Override public void move() { System.out.println(" Use Gasoline Move!"); } }- 使用电池运行的策略实现
/** * @author: takumiCX * @create: 2018-10-15 **/ /** * 使用电能运行的策略实现 */ public class ElectricityMoveStrategy implements MoveStrategy { @Override public void move() { System.out.println(" Use Electricity Move!"); } }- 具体的汽车实现类
比如我们通过继承的方式定义一辆特斯拉汽车,特斯拉汽车默认是纯电动的
/** * @author: takumiCX * @create: 2018-10-13 **/ public class TeslaCar-
