策略模式 -- Strategy

2017-04-16 20:18:49   最后更新: 2017-04-16 20:18:49   访问数量:245




有时,我们需要动态的决定需要在程序中使用一组算法中的某一个,例如众所周知的,在不同的平台,有不同的换行指令,\n、\r 或 \r\n,虽然换行符看上去很简单,但是如果将他们硬编码到代码中,会是很难维护的,尤其是如果实际上这一组算法更加复杂的时候,会让项目过于庞大,同时,有时我们需要增加新的算法

通常,一个很好的解决办法是我们通过一系列封装类来封装不同的算法,这就是策略模式

 

如上所述,策略模式主要应用于以下场景中:

  1. 许多相关的类仅仅是行为有不同,则可以让策略类封装各个不同的行为,从而让相关的类可以复用
  2. 需要使用一个算法的不同的变体
  3. 算法使用了客户不应该知道的数据,数据封装在策略类中,从而避免了暴露
  4. 一个雷定义了多个行为,通过条件语句来动态选择需要的行为,通过将条件分支放入策略类,可以简化掉代码中的多个分支的逻辑

 

 

 

如上图所示,策略模式由以下组件构成:

  • Strategy -- 对外提供的算法公共接口抽象类,Context 通过 strategy 成员调用行为方法
  • ConcreteStrategy -- Strategy 抽象类的具体实现,每种算法对应一个 ConcreteStrategy,用对应的算法实现 Strategy 定义的行为
  • Context -- 程序上下文,通过保存的 Strategy 对象,实现行为的执行

 

通常 Context 通过为 Strategy 对象传递具体的环境参数,或将自己传递给 Strategy 来让 Strategy 决定调用哪个具体实现类的方法

也可以通过面向对象的多态性,为 Context 的 Strategy 对象赋值不同的具体实现类对象,实现算法的切换

 

Strategy 模式有以下优点:

  • Strategy 类层次为 Context 维护了一个可供重用的算法系列,公共功能与独立的算法分离,整个系统从而变得非常清晰
  • 易于切换、增删和扩展一个行为所使用的算法
  • Context 的业务逻辑变得简洁而清晰

 

但是策略模式增加了很多对象,造成了很大的开销,解决这个问题的方法是让每个策略都不保存自己的状态,他们的状态由 Context 维护,结合 Flyweight 模式,可以实现策略的共享

 






读书笔记      技术帖      龙潭书斋      面向对象      oop      设计模式      design pattern      strategy      策略模式     


京ICP备15018585号