最近学习了HeadFirst 设计模式,希望通过一篇文章来整理一下自己的所学,加深一下理解。
1 策略模式
策略模式:定义了算法族,分别分装不同的行为,让这些行为或者说实现之间相互替换,此模式让算法的变化独立于使用算法的客户。
设计原则:
- 找出应用中可能需要变化之处,把他们独立出来,不要核那些不需要变化的代码混在一起。(把会变化的大部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响其他不需要改变的部分)
- 针对接口编程,而不是针对实现编程(针对超类型编程)。
- 多用组合,少用继承。
我们通过一张类图来说明一下这个设计模式以及这些设计原则
从图中我们可以看到有一个基类Duck,它有2个类成员,一个是FlyBehavior,一个是QuackBehavior 这里就体现了“针对接口编程”的原则,这2个类成员都是接口类型,这样做的好处就是可以通过set方法来设定具体的接口实现类作为类的成员,比如我们可以在Duck的继承类MallardDuck 中将FlyBehavior设置为FlyWithWins来实现需要的具体行为,当然也可以设置成其他的该接口的实现类。这就显得非常灵活了。
再看看我们这边用的两个成员变量,除了都是接口类型以外,其实也是把两种不同的抽象行为组合在了一起,这就是“多用组合,少用继承”,其实可以理解为是特别针对接口来说的,多用不同接口的组合,让系统变得更加有弹性。
最后我们从整个类图中看一下,我们把飞行和呱呱叫的行为抽象了出来,为什么?因为这两种行为有很多种可能的实现,或者说有很多种变化,抽象出来以后可以让这部分容易变化的地方与原来的代码解耦,你可以根据你所需要的实现进行设置。而那些不变的方法,比如perforFly,就是调用fly方法,对于每个实现类来说都是不变的,变的只是其中的fly方法的具体实现,所以这部分就不需要抽象出来进行不同的实现。
未完待续