设计模式学习——Strategy(策略)

意图:可以根据所处上下文,使用不同的业务规则或算法。

问题:对所需算法的选择取决于发出请求的客户或者要处理的数据。如果只有一些不会变化的算法,就不需要Strategy模式。

解决方案:将对算法的选择和算法的实现相分离。允许根据上下文进行选择。

参与者与协作者:
1. Strategy指定了如何使用不同的算法。
2. 各ConcreteStrategy实现了这些不同的算法。
3. Context通过类型为Strategy的引用使用具体的ConcreteStrategy。Strategy与Context相互作用以实现所选的算法(有时候Strategy必须查询Context)。Context将来自Client的请求转发给Strategy。

效果:
1. Strategy模式定义了一系列的算法。
2. 可以不使用switch语句或条件语句。
3. 必须以相同的方式调用所有的算法(它们必须拥有相同的接口)。各ConcreteStrategy与Context之间的相互作用可能需要在Context中加入获取状态的方法。

实现:让使用算法的类(Context)包含一个抽象类(Strategy),该抽象类有一个抽象方法指定如何调用算法。每个派生类按需要实现算法。注意,在原型Strategy模式中,选择所用具体实现的职责由Client对象承担,并转给Strategy模式的Content对象。

结构图:

从技术角度而言,Strategy模式就是用来封装算法的。但是在实现,可以用它来封装几乎任何类型的规则。一般说来,只要在分析过程中听到需要在不同时间应用不同业务规则,就可以考虑使用Strategy模式处理这种变化的可能性。

摘自《设计模式解析》(第2版)第8章

Tags:

Leave a Reply


提醒: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。请务必注意user必须和评论者名相匹配(大小写一致)。