1 简介
1.1 定义
也叫做政策模式(Policy Pattern)
- 维基百科
对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法. - 定义
Define a family of algorithms,encapsulate each one,and make them interchangeable.
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
常见 if/else 结构。
1.2 类型
行为型。
在运行时
(非编译时)改变软件的算法行为。
1.3 主要思想
定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口。
策略模式使用的就是OOP的继承和多态。
1.4 主要角色
通用类图
Context 封装角色
即上下文角色,起承上启下的封装作用。屏蔽高层模块对策略&算法的直接访问,封装可能存在的变化。
Strategy 抽象策略角色
策略&算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
ConcreteStrategy 具体策略角色
实现抽象策略中的操作,含有具体的算法。
通用源码
- 抽象策略角色
一个非常普通的接口,在项目中就是一个普通接口,定义一或多个具体算法。
2 适用场景
一个对象,其行为有些固定不变,有些又容易变化。对于这些容易变化的行为,我们不希望将其实现绑定在对象中,而希望能够动态地针对不同场景产生不同应对的策略。
这时就要用到策略模式,就是为了应对对象中复杂多变的行为而产生的:
- 系统有很多类,而他们的区别仅在于行为不同
- 一个系统需要动态地在几种算法中选择一种
3 优点
- 符合开闭原则
- 避免使用多重条件转移语句
e.g. 省去大量 if/else、switch,降低代码耦合度 - 提高算法的保密性和安全性
只需知道策略的业务功能,而不关心内部实现
4 缺点
- 客户端必须知道所有的策略类,并决定使用哪个策略类
- 产生很多策略类
5 相关设计模式的差异
5.1 V.S 工厂模式
- 行为型
接收已经创建好的对象,从而实现不同的行为 - 创造型
接收指令,创建符合要求的具体对象
5.2 V.S 状态模式
- 若系统中某类的某行为存在多种实现方式,客户端需知道到底使用哪个策略
- 若系统中某对象存在多种状态,不同状态下的行为又具有差异,状态之间会自动转换,客户端不需要关心具体状态