STRATEGY(策略)——对象行为模式
1.意图
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
2.别名
政策(Policy)
3.动机
l 人机对弈程序可以采用多种搜索算法。将这些算法硬编码进使用它们的类中是不可取的,其原因如下:
l 客户程序如果直接包含搜索算法代码的话将会变得复杂,这使得客户程序庞大并且难以维护,尤其当需要支持多种搜索算法时问题会更加复杂。
l 不同的时候需要不同的算法,我们不想支持我们并不使用的搜索算法。
l 当搜索功能是客户程序的一个难以分割的成分时,增加新的搜索算法或改变现有算法将十分困难。
我们可以定义一些类来封装不同的搜索算法,从而避免这些问题。一个以这种方法封装的算法成为一个策略(strategy),如下图所示。
搜索策略不是Composition类实现的,而是由抽象的CSearchEngine类的子类各自独立地实现的。以下是图中所设计类的说明:
1. CSearchEngine类:搜索引擎基类.
2. CNegaMaxEngine类:负极大值法搜索引擎.
3. CAlphaBetaEngine类:采用了Alpha-Beta剪枝技术的搜索引擎.
4. CFAlphaBetaEngine类:fail-softalpha-beta搜索引擎.
5. CHistoryHeuristic类:历史启发类.
6. CAlphabeta_HHEngine类:带历史启发的Alpha-Beta搜索引擎.
7. CAspirationSearch类:渴望搜索引擎.
8. CIDAlphabetaEngine类:迭代深化搜索引擎.
9. CMTD_fEngine类:MTD(f)搜索引擎.
10. CTranspositionTable类:置换表.
11. CAlphaBeta_TTEngine类:加置换表的Alpha-Beta搜索引擎.
12. CPVS_Engine类:极小窗口搜索引擎.
13. CNegaScout_TT_HH类:使用了置换表和历史启发的NegaScout搜索引擎.
Composition维护对CSearchEngine对象的一个引用。一旦Composition需要搜索,它就将这个职责转发给它的CSearchEngine对象。Composition的客户指定应该使用哪一种CSearchEngine的方式就直接将它想要的CSearchEngine装入Composition中。
4.适用性
当存在以下情况时使用Strategy模式
l 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
l 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
l 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
l 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以替代这些条件语句。