STRATEGY(策略)——对象行为模式

来源:互联网 发布:最新java面试题及答案 编辑:程序博客网 时间:2024/04/28 19:42

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类中以替代这些条件语句。

 

 
原创粉丝点击