本章从浅入深的讲解了策略模式的使用,以及策略模式中所涉及到的几个设计原则,在本章的最后给出了策略模式的定义。
1、定义及优点
什么是策略模式呢?
答:定义算法族(对象),分别封装起来,让他们之间可以相互替换。
优点:算法(对象)的变化独立于使用算法的客户
如果,没有看本章前面的东西,直接给我这么一个定义,我也不明白这说的是什么意思。然而,如果你读了前面的东西,在来看这个定义就很简单了。
通俗来说就是(我个人的理解),把相互独立的东西独立出来,单独定义成算法(也就是对象,java世界中万物皆对象),然后在另一对象要使用该算法的时候直接引用该算法,这样,当算法发生变化或者引用另一个算法时,不会影响到使用算法的客户(也就是刚才说的引用算法的对象)。
以上就是我自己理解的策略模式,这种模式在你理解之后,会发现,实际的工作或学习过程中,我们在很多地方会用到策略模式。比如,当你定义一个USER的时候,这个 USER中会有姓名、性别、联系方式、地址,而地址又是一个独立的对象,封装了省、市、县、街道、详细地址,你在USER中引用这个地址,即便地址修改了,也不会影响到使用 这个地址的USER,这应该就是最简单的策略模式了,相对复杂点的就是下面本书中说道的“鸭子问题”了。
2、鸭子问题
由于我本地并没有装visio,所以就用画图简单的画了一个“类UML图”(我们暂且这么称呼它吧)。
右下方的QuackBehavior是封装的呱呱叫行为,忘标注了。;-)
“类UML图”说明:
鸭子本身会有颜色,并且自身会游泳,所以游泳直接在基类中实现(因为所有鸭子都会游泳),而鸭子的颜色需要子类来实现(毕竟所有的鸭子并不是同一个颜色的);
然而有的鸭子在自觉不自觉的过程中学会了飞行(实际是滑翔),而有的鸭子依旧不会这项本领;还有的鸭子出生只会呱呱叫有的是吱吱叫还有得生病了不会叫。
1、这时候,在定义飞行跟叫的时候,考虑到不同的鸭子行为是不一样的,第一时间想到的是继承,然而如果继承字基类Duck,那么在子类中会出现大量的重复代码(有部 分鸭子是会飞的,有部分是不会飞的;大部分鸭子是呱呱叫),所以这时候要考虑把这些重复的代码抽取出来,独立封装,就得到了相对应的飞行/叫的行为。
2、如果,不同的行为定义为不同的类,会发现,在鸭子类中引用会很麻烦。这时候就考虑到了面向接口编程,只管接口,而不需要去考虑具体实现,这样,只需要在鸭子 中引入接口即可,在运行时将飞行行为动态绑定到鸭子上。
通过上面两步分析,我们终于比较完美的实现了这个过程,这就是策略模式。
3、涉及到的设计原则
A)、找出代码中需要变化之处,把他们独立出来,将其与不需要变化的代码相分离,以便日后可以轻易的改动和扩充;
<不同的鸭子,它的飞行和叫可能是不一样的,并且可能有的鸭子不会飞也不会叫,而有的鸭子即会飞也会叫>
B)、面向接口编程,而不是面向实现编程。
<说明:这里的接口,不是Java中实际意义的Interface,关键在于Java的多态。你可以面向接口、抽象类编程>
C)、更多的去使用组合代替继承。
<HAS-A 要优于 IS-A,因为HAS-A可以在运行时动态改变其行为而不影响调用该行为的对象。鸭子有一个飞行和叫的行为,而不是让所有的鸭子去继承自基类的行 为>
关于第1章的策略模式就介绍到这里,如果以上内容有出错的地方,还请不吝赐教,大家共同学习。
第2章的观察者模式会在最近几天更新....
转载请注明出处,谢谢!