策略设计模式(Strategy Pattern),是一种实现某个功能有多种替换方案的设计模式。比如,我们出去旅游出行,可以选择骑行,也可以选择坐汽车,也可以选择高铁。这里面骑行、坐汽车或坐高铁就是一种选择策略,可替代性的方式。
典型的策略设计模式UML图如下所示。
其中,Strategy为抽象的接口(或抽象类),其中定义了AlgorithmInterface方法。下面有三个具体的实现类,分别是ConcreteStrategyA、ConcreteStrategyB和ConcreteStrategyC类,分别实现了自己的AlgorithmInterface方法。
在顶层Context类中,根据调用选择具体的子类中的AlgorithmInterface方法。
下面我们基于Java实现上面介绍的案例,如下所示。
实现代码如下:
(1)定义IStrategy接口
(2)IStrategy接口的三个实现类
(3)Person类
(4)测试类
总结:
Strategy模式有下面的一些优点:1) 相关算法系列 。Strategy类层次为Context定义了一系列的可供重用的算法或行为。 继承有助于析取出这些算法中的公共功能。
2) 提供了可以替换继承关系的办法: 继承提供了另一种支持多种算法或行为的方法。你可以直接生成一个Context类的子类,从而给它以不同的行为。但这会将行为硬行编制到 Context中,而将算法的实现与Context的实现混合起来,从而使Context难以理解、难以维护和难以扩展,而且还不能动态地改变算法。最后你得到一堆相关的类 , 它们之间的唯一差别是它们所使用的算法或行为。 将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。
3) 消除了一些if else条件语句 :Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时 ,很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。
4) 实现的选择 Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择。
Strategy模式缺点:自己思考!!!
思考1:策略设计模式和简单工厂设计模式区别?
简单工厂设计模式根据传入的键值(比如名称),返回一个具体实例。而策略模式持有一个接口,根据传入的该接口的具体子类调用子类的方法。其传入的是子类的实际对象(比如本例中传入的new AirplaneStrategy())。
思考2:策略模式的用途?
比如我们升级系统,所谓的升级其实是替代以前功能中的某些方法。那么我们可以根据这个策略模式,新增新的类,然后通过类的反射机制来实现。
其中forName中的参数通过配置文件配置,从而实现创建新的实例。