模板方法模式是一種非常簡單實用的模式,本文對模板方法模式進行了簡單的介紹,對意圖,結構等進行了描述,並且給出了Java的示例代碼,模板方法模式是對面向對象程式設計繼承的一個很優秀的使用,想一下Thread的start和run方法,再想想模板方法模式的含義,你是否會想到什麼? ...
模板方法模式 Template method 上圖為網上百度的一份簡歷模板截圖 相信大家都有求職的經歷,那麼必然需要簡歷,寫簡歷的時候,很可能你會網上檢索一份簡歷模板,使用此模板的格式,然後替換為你的內容。 我們從小就有語文課,逢考必有作文,而學習的途徑之一就是參考優秀的範文,學習瞭解他們的結構,風格等。 以上就是現實世界中的模板,模板的概念隨處可見,所有的工業製品哪個不是模具生產的? 在程式設計中,也有模板的概念 在軟體開發過程中,可能經常會用到類似的處理邏輯,但是可能又有一些細節的差異 比如做菜,不管做什麼菜,基本上都離不開買菜,洗菜,切菜,做菜幾個主要步驟 這幾個步驟中,只有做菜的差別最大,不同的菜不同的做法,而買菜洗菜切菜的過程,卻基本類似 我們常常希望能夠定義一個通用的處理框架,然後將一部分實現細節交由子類進行處理 也就是面向框架進行編程,而不是每次都複製粘貼修改代碼,具體的細節依靠子類確定,這就是模板的初衷。 比如定義一個做菜的抽象類,實現了買菜,洗菜,切菜,做菜方法定義為抽象方法留待子類實現 那麼,回鍋肉和大頭菜就可以通過繼承擴展做菜類,只需要實現做菜的環節即可。
意圖
定義一個操作中的演算法的骨架,而將一些步驟延時到子類中。 TemplateMethod使得子類可以不改變一個演算法的結構即可重新定義演算法的某些特定步驟。結構
抽象模板角色AbstractClass 定義一個或者多個抽象步驟,這些抽象操作叫做基本操作 他們可能是一個複雜操作的組成步驟 實現類角色ConcreteClass 實現父類所定義的一個或者多個抽象方法 每一個抽象模板都可以有任意多個具體的模板角色與之對應,而實際中,一般不止一個代碼示例
定義做菜步驟:買菜,洗菜,切菜,做菜。 買菜、洗菜、切菜都一樣,做菜不同菜不同做法 上菜將他們步驟進行打包package template; public abstract class 做菜 { public void 買菜(){ System.out.println("買菜..."); } public void 洗菜(){ System.out.println("洗菜..."); } public void 切菜(){ System.out.println("切菜..."); } public abstract void 做菜(); public void 上菜(){ 買菜(); 洗菜(); 切菜(); 做菜(); System.out.println("客官,菜來了~~~"); } }做回鍋肉和做大頭菜都重寫了“做菜”的方法
package template; public class 做回鍋肉 extends 做菜 { @Override public void 做菜() { System.out.println("做回鍋肉..."); } }
package template; public class 做大頭菜 extends 做菜 { @Override public void 做菜() { System.out.println("做大頭菜..."); } }
測試代碼