一.概念
模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
二.uml
abstractclass(定義了演算法的骨架)。
concreteclass(定義了演算法估計中具體演算法的實現)。
三.例項分析
做菜,對我來說是相當的簡單。我做菜,都是乙個流程:洗菜-放油-放菜-放鹽-小炸一下-小煮一下-...。做魚和做肉,除了最後魚肉的差別外,其它的辣椒顏色,味道什麼的,毫無差別。就拿這個例子來說明今天的模式。
/** * 做菜
* @author eason
* */
public abstract class cook }
//準備工作
public void prepare()
//放油
public abstract void putoil();
//放菜
public abstract void putfood();
//放作料
public void putcondiments()
//等待
public abstract void waitamoment();
//品嚐是否美味,預設美味,子類不需要重寫此方法
//如果不美味,子類重寫此方法即可
public boolean tastedelicious()
//做點其它的事情,讓味道更好
public void dootherthings()
}cookfish
package com.zzy.templatemethod;
/** * 做魚
* @author eason
* */
public class cookfish extends cook
@override
public void putfood()
@override
public void waitamoment()
}
cookegg
package com.zzy.templatemethod;
/** * 做雞蛋
* @author eason
* */
public class cookegg extends cook
@override
public void putfood()
@override
public void waitamoment()
@override
public boolean tastedelicious()
@override
public void dootherthings()
}
testtemplatemethod
package com.zzy.templatemethod;
/** * 測試類
* @author eason
* */
public class testtemplatemethod
}
四.使用場景及使用感受模板定義了一系列演算法的步驟,這一系列演算法中肯定有乙個抽象的演算法,也就是模板方法是乙個工作的概要,至於一套完完整整的工作,是需要子類來參與的。
如果對這一系列的演算法,有些子類不需要其中的某乙個或者某一些演算法,可以用"掛鉤"來實現,鉤子說明了演算法的可選性。模板類裡面定義這些演算法的預設實現或者空實現,子類有需要的話就重寫這些演算法。如上述中的tastedelicious方法和dootherthings方法。
當不變的和可變的方法在子類實現中混在一起的時候,不變的行為就會在子類中重複出現。通過模板方法模式把這些不變的行為搬到單一的地方,可以幫助子類擺脫重複的不變行為的糾纏。
C 設計模式(十一)模板方法模式
理解了模板方法的定義之後,自然實現模板方法也不是什麼難事了,下面以生活中炒蔬菜為例來實現下模板方法模式。在現實生活中,做蔬菜的步驟都大致相同,如果我們針對每種蔬菜類定義乙個燒的方法,這樣在每個類中都有很多相同的 為了解決這個問題,我們一般的思路肯定是把相同的部分抽象出來到抽象類中去定義,具體子類來實...
設計模式學習 模板方法模式
型別 行為模式 模板方法模式定義乙個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些 特定步驟。uml圖 新建賽車的父類 package car package public class car parent public void setsp...
設計模式學習 模板方法模式
1.雜言 設計模式,現在覺得每種模式像工業行業的一些典型零件。這些零件也可以變種出很多類似零件。吧這些零件組合起來,就成了一台機器。好吧,我現在是這麼理解的。一般 結構都是,一層呼叫一層,就是一般都是頂層的呼叫底層的。但模板方法確實反過來的,有父類呼叫子類的方法。這個聽說又牽扯到啥好萊塢原則。對於這...