《
Head first design patterns
》
一直被束之高阁,总算考完期末考试。然而,我却又要开始复习考研的东西了,整天看数学看的十分头晕,把这本书重新拿来看,权当连环画来看。
以前已经看过两章了,实在太过久远,只得重温一下。
前面的
Introduction
其实是非常有意思的,在这先不赘述了。
介绍的第一个
Pattern
是
Strategy Pattern
。
通过一个
duck
的例子,在讲述
Strategy Pattern
的过程中引出了三个
Design Principles
它们是:
1.
Identify the aspects of your application that vary and separate them from what stays the same.
2.
Program to an interface, not an implementation.
3.
Favor composition over inheritance.
Duck
例子完美地体现了以上三个
Principles
。
一开始
Duck
类是这样的,里面有三个方法:
quack(), swim()
和
display(),
其它一些特殊的
Duck
子类继承这个父类,并重载
display
方法去显示各种不同种类的
Duck
。
现在需求变更,需要让一些
Duck
能够有飞的能力,理所当然地,在父类中加上了
fly()
这个方法。但一些不能飞的
Duck
类却同时拥有了
fly()
方法,这显然是不对的。
可能有人提出解决的方法是重载那些不需要
fly()
方法的
duck
类的
fly()
,让这个方法什么也不做,但你有没有想过如果这么处理,以后再加一些不需要一些方法的子类是不是很繁琐?
也许又有人想到了,把
fly()
和
quack()
提取出来,编程
interface
。如果某个子类需要这个能力可以去
implement
这个
interface
。
有没有想过后果?每一个子类都要重写
fly()
和
quack(),OO
的代码重用的特性荡然无存。
那什么才是最好的解决之道呢???
书里面给出了答案。
把
fly()
和
quack()
两个功能提取出来这个思路是对的。这里体现了第一个
Principle
。首先声明
FlyBehavior()
和
QuackBehavior()
两个
interface
,然后实现各种
fly
和
quack
,比如
FlyWithWings, FlyNoWay
;
Quack, Squeak
等等。这里体现了第二个
Principle
。
现在的
Duck
父类已经变了,里面有两个私有变量
FlyBehavior fb,
和
QuackBehavior qb
。
Duck
父类甚至可以直接声明成
Abstract
类,当有子类继承它的时候,可以在构造函数里给
fb
和
qb
初始化的时候直接赋给它需要的
fly
和
quack
种类。这里体现了第三个
Principle
。
小小的一个例子已经分析的那么专业,让我受益匪浅。好书!