<a href="http://www.cnblogs.com/wolf-sun/p/3468100.html">[Head First設計模式]山西面館中的設計模式——裝飾者模式</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3473744.html">[Head First設計模式]山西面館中的設計模式——觀察者模式</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3475061.html">[Head First設計模式]山西面館中的設計模式——建造者模式</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3485805.html">[Head First設計模式]餃子館(冬至)中的設計模式——工廠模式</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3489549.html">[Head First設計模式]一個人的平安夜——單例模式</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3514935.html">[Head First設計模式]搶票中的設計模式——代理模式</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3518013.html">[Head First設計模式]面向對象的3特征5原則</a>
<a href="http://www.cnblogs.com/wolf-sun/p/3534573.html">[Head First設計模式]鴨子模型——政策模式</a>
第一天上班,沒什麼任務,就學習了下模版方法模式,這裡也是現學現賣,模版方法給我的感覺是似曾相識,總感覺用過,而當時并不知道是模版方法,挺悲催的。年後第一天,吃飯是個大問題,好不容易找到一個米線館,人非常的多,隻能邊等邊思考模版方法模式了,跟以前一樣,對于吃貨來說,隻有将知識和吃聯系在一起,才能記得更牢。
模版方法模式是最為常見的幾個模式之一,模版方法模式需要開發抽象類和具體子類的設計師之間的寫作。一個設計師負責給出一個算法的輪廓和骨架,另一些設計師負責給出這個算法的各個邏輯步驟。 繼承常常作為功能複用的主要工具,這時繼承有被濫用的危險。是以,我們有一個設計原則:多用組合,少用繼承
是不是繼承就根本不應該使用呢?事實上對資料的抽象、繼承、封裝和多态是面向對象語言的最重要特性。繼承不應當被濫用,并不意味着繼承根本就不該使用。在GoF書中,絕大多數模式是将依賴于繼承的實作轉換為基于對象的組合和聚合來實作的。模版方法模式是很少用繼承來實作的模式中的一個!而且模版方法模式:鼓勵恰當的使用繼承。此模式可以用來改寫一些擁有相同功能的相關類,将可複用的一般性的行為代碼移到基類裡面,而把特殊化的行為代碼移到子類裡面。熟悉模版方法模式便成為一個重新學習繼承的好地方。
咖啡因飲料
咖啡類
茶類
第一版設計
星巴茲咖啡和茶沖泡的分析
星巴茲咖啡和茶沖泡采用了相同的算法:
把水煮沸
用熱水泡咖啡或茶
把飲料倒進杯子
在飲料内加入适當的調料
抽象PrepareRecipe()
1、我們遇到的問題是:茶使用SteepTeaBag()和AddLemon()方法,而咖啡使用BrewCoffeeGrinds()和AddSugarAndMilk()方法。
2、無論是咖啡的沖泡,還是茶的浸泡,都是用沸水泡,我們給它一個新的方法名稱,比如說Brew()。同樣,無論是咖啡加糖和牛奶,還是茶加檸檬,都是加調料,我們也給它一個新的方法名稱AddCondiments()。這樣,新的prepareRecipe()方法看起來就象這樣:
3、CaffeineBeverage(咖啡因飲料)超類:
4、咖啡和茶都依賴于超類(咖啡因飲料)處理沖泡法。
我們做了什麼?
剛剛實作的就是模闆方法模式。模闆方法定義了一個算法步驟,并允許子類為一個或多個步驟提供實作。我們再看看咖啡因飲料類的結構(下頁)。
模闆方法如何工作(以泡茶為例)
定義一個操作中算法的骨架,而将這些步驟延遲到子類中,模闆方法使得子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟。
鈎子是一種聲明為抽象類的方法,但隻有空的或預設的實作。有了鈎子,可以讓子類有能力對算法的不同點進行挂鈎。要不要挂鈎,由子類自行決定。
對模版方法挂鈎
使用鈎子
為了使用鈎子,我們在子類中覆寫它。在這裡,鈎子控制咖啡因飲料是否執行某部分算法。或更确切的說是在飲料中要不要加進調料。
測試
結果
好萊塢原則:别調用(打電話給)我們,我們會調用(打電話給)你。
好萊塢原則可以防止“依賴腐敗”。當高層元件依賴底層元件,底層元件又依賴高層元件,高層元件又依賴邊側元件,邊側元件又依賴高層元件......,依賴腐敗就發生了。在這種情況下,沒有人可以輕易搞懂系統是如何設計的。
在好萊塢原則下,允許底層元件挂鈎到系統上,但是高層元件會決定什麼時候和怎樣使用這些底層元件。即高層元件對底層元件的方式是:“别調用我們,我們會調用你”。
好萊塢原則與模版方法
雲南米線分為:秀才米線,舉人米線,狀元米線等。但是他們的制作過程基本相同,隻是配料不同罷了,同樣可以将制作過程放在模版方法中。
View Code
模版方法了解起來還是比較輕松的,在項目中真的用到過,隻是當時不知道它還有個漂亮的名字。
參考書:
Head First 設計模式