設計模式:模板方法模式
定義:模板方法模式在一個方法中定義了一個算法的固件,而將一些步驟延遲到子類中。模板方法使得子類可以在不該變算法結構的情況下,重新定義算法中的某些步驟。
這個模式是用來創建一個算法的模板,更具體的說,這個方法將算法定義成一組步驟,其中的任何步驟都可以是抽象的,由子類負責實現。這可以確保算法的結構保持不變,同時由子類提供部分實現。
對模板方法進行掛鉤
鉤子是一種被生命在抽象類中的方法,但只有空的或者默認的實現。鉤子的存在,可以讓子類有能力對算法的不同點進行掛鉤。要不要掛鉤由子類自行決定。
但你的子類“必須”提供算法中的某個方法或者步驟的實現時,就使用抽象方法,如果算法的這個部分是可選的,就用鉤子。如果是鉤子的話,子類可以選擇實現這個鉤子,但并不強制這么做。
鉤子可以讓子類實現算法中可選的部分,或者在鉤子對于子類的實現并不重要的時候,子類可以對此鉤子置之不理。鉤子的另一個用法,是讓子類能能夠有機會對模板方法中某些即將發生的(或剛剛發生的)步驟做出反應。鉤子可以讓子類有能力為其抽象類做一些決定。
保持抽象方法的數目越來越好,讓算法中的步驟不要切分的太細,但是如果步驟太少的話,會比較沒有彈性,需要看情況折衷
設計原則:好萊塢原則
別調用(打電話給)我們,我們會調用(打電話給)你。
好萊塢原則可以給我們一種防止“依賴腐敗”的方法。當高層組件依賴低層組件,而低層組件又依賴高層組件,而高層組件又依賴邊側組件,而邊側組件又依賴低層組件時,依賴腐敗就產生了。在好萊塢原則上,我們允許低層組件將自己掛鉤到系統上,但是高層組件會決定什么時候和怎樣使用這些低層組件。換句話說,高層組件對待低層組件的方式是“別調用我,我會調用你”
和依賴倒置原則之間的關系
依賴倒置原則教我們盡量避免使用具體類,而多使用抽象。而好萊塢原則是用在創建框架或組件上的一種技巧,好讓低層組件能夠被掛鉤進計算中,而且又不會讓高層組件依賴低層組件。兩者的目標都是在與解耦,但是依賴倒置原則更加注重如何在設計中避免依賴。
好萊塢原則則教我們一個技巧,創建一個有彈性的設計,而又防止其他類太過依賴他們。
我們要避免低層組件和高層組件之間有明顯的環狀依賴。
Vs策略模式
- 策略模式定義了一個算法家族,并讓這些算法可以互換。正因為每一個算法都被封裝起來了,所以客戶可以輕易的使用不同的算法。
- 模板模式的工作是定義一個算法大綱,由子類定義其中一些步驟的實現內容,整個算法的結構保持不變。
- 策略模式是通過對象組合的方法事項,模板模式是通過繼承事項
要點:
- “模板方法”定義了算法的步驟,把這些步驟的實現延遲到了子類。
- 模板方法模式為我們提供了一種代碼復用的重要技巧
- 模板方法的抽象類可以定義具體方法、抽象方法和鉤子
- 抽象方法由子類實現
- 鉤子是一種該方法,它在抽象類中不做事,或者只做默認的事情,子類可以選擇要不要覆蓋它。
- 為了防止子類改變模板方法中的算法,可以將模板方法生命為final
- 好萊塢原則告訴我們,將決策權放在高層模塊中,以便決定如何以及何時調用低層模塊
- 你將在真實世界中的代碼中看到模板方法模式的許多變體,不要期待他們全都是一眼可以認出來的
- 策略模式和模板方法模式都封裝算法,一個用組合,一個用繼承
- 工廠方法是模板方法的一種特殊版本