期末考期間實在無聊,不想看那些本學期無聊的課程,随便應付下能過的,于是坐在圖書館,書架上抓了本《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