期末考期间实在无聊,不想看那些本学期无聊的课程,随便应付下能过的,于是坐在图书馆,书架上抓了本《Head First: Design Pattern》
先说这确实是本好书,不愧是JOLT大奖得主,O'RELLY出品,必属精品(虽然这句话是用来形容暴雪的),但书中那样趣味的写法和图示一扫我之前对设计模式的理解障碍。之前看的那些图书,你必定有一定的OO代码编写经验,而且一个个枯燥的类图,你根本无法记住何时需要引入这些模式,以及不同模式间的区别,现在好了,有了“Head First”,看一遍,抵过去看五遍(哇咔咔咔咔咔咔)。。。
OK,不乱侃了。偶不过才看了50多页的书,理解完了STRATEGY模式:
原书使用JAVA描述,所以此处也使用JAVA的术语,书中描绘了一个DUCK实例,举出了使用传统的继承方式所产生的弊端:主要是没个子类有各自的方法,当有许多类时,代码将难以维护。
OK,随后是使用STRATEGY模式的例子:保留原有的基类和继承的方式,超类中包含具有相同实现的行为,子类继承超类,可选择性地对这些行为进行修改。而对于那些在不同子类中具有不同实现的行为,对其定义接口,定义对行为具体实现的类(类中implement此接口,并仅包含对特定方法的实现)。这样,超类中将包含这些需要的接口,在子类初始化时,将初始这些接口,指定其指向的类。
书中例子的类图:
例子中,DUCK超类拥有公有的行为:fly()、quack()、display()。拥有两个接口成员:QuackBehavior、FlyBehavior。FlyBeahvior作为接口,有其实现的具体类如:FlyWithWings,FlyNoWay(你也可以实现自定义的其它Fly行为,只需实现此接口即可)。QuackBehavior与FlyBehavior类似。OK,现在每一个特殊的行为实现都模块话了,在你定义子类时,只要把这个模块拉进来就行了。
STRATEGY模式的最大优点是代码的高重用性,以及以此带来的易维护性。当你对对每个具体方法使用接口和类进行封装后,当你想再次使用此方法时,你只要包含实现此方法的类就可以了。而当你要对某一方法进行修改时,只需对实现此方法的类进行修改,也就能修改到全部了。程序员的“八荣八耻”里不是说了吗,我们要以“以代码重用为荣,以复制粘贴为耻;”,咔咔~
PS:(1)关于STRATEGY模式还有一个较好的介绍:Gossip的STRATEGY模式
(2)本文的图来自2007年软件设计师考试下午第七题
(3)偶素大菜鸟,文中有啥错误,请您指出偶的错误,THX