定義
模板方法模式在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中.模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟.
要點
- 模板方法的抽象類可以定義
具體方法,抽象方法和鉤子. - 抽象方法由
子類實現(xiàn). - 鉤子是一種方法,它在抽象類中不做事或者只做默認的事,子類可以選擇要不要去覆蓋它.
- 為了防止子類改變模板方法中的算法,在
JAVA中可以將模板方法聲明為final. - 高層和底層組件避免出現(xiàn)明顯的
環(huán)狀依賴. -
策略模式和模板算法模式都封裝算法,一個用組合,一個用繼承. -
工廠方法是模板方法的一種特殊版本.
個人理解
我們可以利用模板方法模式,將對象的共同點寫到抽象類的具體實現(xiàn)中去,同時JAVA中因為有final這個關鍵字,子類也無法覆寫抽象類的方法,這就保護了算法執(zhí)行的順序,同時也保證了抽象類中的具體方法不會被子類所篡改.這個final很騷啊,有些小小的o(一︿一+)o.子類將繼承得到的需要改變的方法進行覆寫,就可以完成自己的相應的功能,這與策略模式的組合不同,這里使用的是繼承,突然有點突發(fā)奇想,如果我們使用鉤子來對行為進行組合或者選擇呢?
學到這個模式,我記憶最為深刻的就是這個hook(鉤子)了,以前也接觸過,也明白他在做什么,但并不清楚他的定義是什么.我們什么時候該使用鉤子,什么時候該使用抽象方法呢?書中是這么回答的:當你的子類必須提供算法中的某個方法或者步驟的實現(xiàn)時,就使用抽象方法.如果算法的這個部分是可選擇的,就用鉤子.如果是鉤子的話,子類可以選擇實現(xiàn)這個鉤子,但并不強制這么做.我們可以通過這個鉤子來改變內部代碼的選擇執(zhí)行,甚至可以通過改變這個鉤子的代碼來完全改變抽象類方法的執(zhí)行結果!這是我感受最為頗深的一點.
抽象類的方法多少和內容需要自己去調節(jié)優(yōu)化到一個合適的程度,如果某些步驟是可選的,所以我們可以將這些方法實現(xiàn)成hook,而不是實現(xiàn)成抽象方法,這樣可以讓抽象類的子類負荷減輕.