GOF对于策略模式的定义是“定义一系列的算法,把它们一个个封装起来, 而且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化”。算法
关于这句话的理解可分为两步骤,第一个步骤封装算法,第二步骤算法独立于客户。咱们看看策略模式的结构类图。函数
这里的Context类就是客户类,客户类把关于算法的实现委托给了其余的ConcreteStrategy。这样算法能独立于客户类变化,并且也方便了算法类被其余客户类复用。因为独立出了一个封装算法的父类,策略模式的这种结构带来的好处是显而易见的,包括算法子类能够复用父类的代码,客户能够很方便的改变他的算法等等。同时这类结构也增长了系统调用开销和类的数目。this
gof在书中花了大段篇幅来解释策略模式的实现策略。其中重要的是关于Strategy和Context的接口的设计。gof提供了两种实现策略,这两种共同的地方是把Strategy对象做为构造Context对象的参数传入或是Context提供一个函数动态设置它的Strategy对象。不一样的地方在于:第一种是使用Strategy策略时经过传入参数调用Strategy函数来达到实现调用的目的,第二种则是把Context对象的this指针传入Strategy,在Strategy中使用Context的指针主动的获取Strategy的信息。毫无疑问第二种方法将会带来这两种类的更深更紧密的耦合度。可是却给Strategy提供了更精细控制的能力。全部具体实现看当时的状况,通常状况下,第一种实现方式就能应付了。设计