示例:
好处:
- 添加新算法时,不需要更改和重新编译现有的排序类层次结构
- 修改算法时,排序层次结构中剩余的类不需要更改和重新编译
- 客户机类和实现类都依赖于抽象接口
context
- 配置了一个具体的策略对象。
- 维护对策略对象的引用。
- 可以定义一个接口,让策略访问它的数据
何时使用
- 当你要处理一些仅仅行为不同的相关的类的时候
- 当你要隐藏实现细节的时候
- 当你要取消许多条件语句的时候
Context**的实现方式**
- 当某算法被调用时,Context类将Strategy类所需要的所有数据一次性地传递完毕
- Context将自己作为一个对象传递给Strategy类,然后Strategy类再利用该对象反过来调用Context类,以便获得某些数据与功能
通常情况下策略模式的交互
- 客户通常创建一个具体策略的对象(ConcreteStrategy)并将其传递给context;
- context将客户的请求转发给策略。
- 客户只与context进行交互。
策略模式优点
定义可重用的相关算法
- 相关算法的系列。StrategyClass的层次结构定义了一系列用于上下文重用的算法或行为。
- 继承可以帮助分解出算法的公共功能
易于扩展
- 将算法封装在单独的策略类中,可以独立于上下文更改算法,使其更易于理解、切换(更改为更有效的算法)扩展。
策略模式的缺点
- 客户必须知道不同的策略。
- 客户在选择合适的策略之前必须了解策略的不同之处
实例: