定義:
模板方法模式(Template Method):定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟,
結構:
- AbstractClass:抽象類,定義并實作了一個模板方法,這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實作,
- ConcreteClass:子類,實作父類所定義的一個或多個抽象方法,每一個 AbstractClass 都可以有任意多個ConcreteClass 與之對應,而每一個 ConcreteClass都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實作,從而使得頂級邏輯的實作各不相同,
- Client:客戶端代碼,
代碼實體:
/** * 抽象類 * Class AbstractClass */ abstract class AbstractClass { /** * 模板方法,定義操作順序,給出邏輯骨架,而邏輯的組成是一些相對應的抽象操作,它們都推遲到子類實作 */ public function templateMethod() { $this->begin(); $this->primitiveOperation1(); $this->primitiveOperation2(); $this->end(); } /** * 抽象行為,由子類實作 */ abstract public function primitiveOperation1(); /** * 抽象行為,由子類實作 */ abstract public function primitiveOperation2(); /** * 一些公用邏輯方法 */ public function begin() { echo '開始' . '<br>'; } /** * 一些公用邏輯方法 */ public function end() { echo '結束' . '<br>'; } } /** * 子類 * Class ConcreteClassA */ class ConcreteClassA extends AbstractClass { public function primitiveOperation1() { // TODO: Implement primitiveOperation1() method. echo 'ConcreteClassA類primitiveOperation1方法的具體實作' . '<br>'; } public function primitiveOperation2() { // TODO: Implement primitiveOperation2() method. echo 'ConcreteClassA類primitiveOperation2方法的具體實作' . '<br>'; } } /** * 子類 * Class ConcreteClassB */ class ConcreteClassB extends AbstractClass { public function primitiveOperation1() { // TODO: Implement primitiveOperation1() method. echo 'ConcreteClassB類primitiveOperation1方法的具體實作' . '<br>'; } public function primitiveOperation2() { // TODO: Implement primitiveOperation2() method. echo 'ConcreteClassB類primitiveOperation2方法的具體實作' . '<br>'; } } // 客戶端呼叫 // ConcreteClassA $concreteClassA = new ConcreteClassA(); $concreteClassA->templateMethod(); // ConcreteClassB $concreteClassB = new ConcreteClassB(); $concreteClassB->templateMethod(); // 結果 開始 ConcreteClassA類primitiveOperation1方法的具體實作 ConcreteClassA類primitiveOperation2方法的具體實作 結束 開始 ConcreteClassB類primitiveOperation1方法的具體實作 ConcreteClassB類primitiveOperation2方法的具體實作 結束
總結:
- 當我們要完成在某一個細節層次一致的一個程序或一系列步驟,但其個別步驟在更詳細的層次上的實作可能不同時,我們通常考慮用模板方法模式來處理,
- 模板方法模式是通過把不變行為搬移到超類,去除子類中的重復代碼來體現它的優勢,我們通過模板方法把這些行為搬移到單一的地方,這樣就幫助子類擺脫重復的不變行為的糾纏,
- 模板方法模式提供了一個很好的代碼復用平臺,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/270950.html
標籤:設計模式
