针对问题

当对象要调用某类算法时(例如排序),同一个算法可能有多种实现方式,客户程序中如果直接包含算法代码会让程序变得庞大并难以维护,这时如果要更改算法实现可能需要重写整个客户程序。Strategy模式将算法封装到独立的类型中,从而避免这些问题。

介绍

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

实现

Strategy模式的静态图如下:

其中:
Strategy类型声明算法接口,并在ConcreteStrategy类型中实现具体算法,必要时可以在算法中回调Context。
Context对象中维护strategy对象的引用,并将算法调用转发给Strategy。

在Context调用Strategy接口时可以传递算法必要的参数,或者直接传递Context本身,前者将使得Strategy和Context进一步解耦。
实现Context时可以使Strategy对象成为可选的,如果Context中有Strategy对象,则执行算法,否则继续执行。… Read the rest