Strategy策略是一种对象行为型设计模式,目的是定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换,算法可独立于使用它的客户而变化。一个常见的应用是文本编辑器,其中有许多算法对一个正文流进行分析,将这些算法硬编进使用它们的类中是不可取的,因为需要换行功能的客户程序如果直接包含换行算法代码的话将会变得复杂,这使得客户程序庞大并且难以维护,尤其当其需要支持多种换行算法时问题会更加严重,而且不同的时候需要不同的算法,我们不想支持我们并不使用的换行算法,当换行功能是客户程序的一个那个分割的成分时,增加新的换行算法或改变现有算法将十分困难。
Strategy策略模式的解构如下图所示:
上图中,Strategy策略定义所有支持的算法的公共接口,Context使用这个接口来调用某ConcreteStrategy定义的算法;ConcreteStrategy具体策略以Strategy接口实现某具体算法;Context上下文用一个ConcreteStrategy对象来配置,维护一个对Strategy对象的引用,可定义一个接口来让Strategy访问它是数据。Strategy和Context相互作用以实现选定的算法。当算法被调用时,Context可以将算法所需要的所有数据都传递给该Strategy。或者,Context可以将自身作为一个参数传递给Strategy操作。这就让Strategy在需要时可以回调Context。Context将它的客户的请求转发给它的Strategy。客户通常创建并传递一个ConcreteStrategy对象给该Context;这样,客户仅与Context交互。通常有一系列的ConcreteStrategy类可供客户从中选择。