目录
意图
- 定义一系列算法,封装每个算法,并使它们可互换。策略让算法独立于使用它的客户端而变化。
- 捕获接口中的抽象,将实现细节隐藏在派生类中。
问题
面向对象设计的主要策略之一是“开闭原则”。
图展示了这是如何实现的——将接口细节封装在基类中,并将实现细节隐藏在派生类中。然后,客户端可以将自己耦合到一个接口,而不必经历与变化相关的剧变:派生类的数量发生变化时没有影响,派生类的实现发生变化时也没有影响。

多年来,软件社区的一个通用价值是“最大化内聚力和最小化耦合度”。图中所示的面向对象设计方法都是关于最小化耦合。由于客户端仅与抽象(即有用的虚构)耦合,而不是该抽象的特定实现,因此可以说客户端正在实践“抽象耦合”。更通用的劝告“最小化耦合”的面向对象的变体。
这种“抽象耦合”原则的一个更流行的特征是“程序到接口,而不是实现”。
客户应该更喜欢接口(或抽象基类)提供的“额外的间接级别”。该接口捕获了客户想要练习的抽象(即“有用的虚构”),并且该接口的实现被有效地隐藏了。
结构
Interface 实体可以表示抽象基类,也可以表示客户端的方法签名期望。在前一种情况下,继承层次代表动态多态性。在后一种情况下,接口实体代表客户端中的模板代码,继承层次代表静态多态。

例子
策略定义了一组可以互换使用的算法。到机场的交通方式就是战略的一个例子。存在多种选择,例如驾驶自己的汽车、乘坐出租车、机场班车、城市巴士或豪华轿车服务。对于一些机场,地铁和直升机也可作为前往机场的交通工具。这些交通方式中的任何一种都可以将旅客带到机场,并且可以互换使用。旅行者必须根据成本、便利性和时间之间的权衡来选择策略。

检查清单
- 识别客户希望通过“弹性点”访问的算法(即行为)。
- 在接口中指定该算法的签名。
- 将替代实现细节埋在派生类中。
- 算法的客户端将自己耦合到接口。
经验法则
- 策略与模板方法类似,但粒度不同。
- 国家就像战略,除了它的意图。
- 策略可以让你改变一个对象的胆量。装饰器可以让你改变皮肤。
- 状态、策略、桥接(以及在某种程度上适配器)具有相似的解决方案结构。它们都共享“句柄/主体”习语的元素。它们的意图不同——也就是说,它们解决不同的问题。
- Strategy 有两种不同的实现方式,第一种类似于 State。不同之处在于绑定时间(策略是一次绑定模式,而状态则更具动态性)。
- 策略对象通常是很好的享元。
本文来自转载,原文链接: