《
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
。
?
小小的一個例子已經分析的那么專業,讓我受益匪淺。好書!
?