定義:在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使的子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。將主要的方法定義為final,防止子類修改演算法骨架,將子類必須實現的方法定義為abstract。而普通的方法(無final或abstract修飾)則稱之為鉤子。
鉤子作用:
1)作為可選內容,子類可以重寫或者置之不理
2)讓子類有機會對模板方法中即將發生的或者已經發生的步驟做出反應
3)作為控制條件,使得子類可以影響到抽象類中的演算法流程
角色:模板抽象父類,模板子類
優點:
1)模板方法模式在乙個類中形式化地定義演算法,而由它的子類實現細節的處理。
2)模板方法是一種**復用的基本技術。它們在類庫中尤為重要,它們提取了類庫中的公共行為。
3)模板方法模式導致一種反向的控制結構,這種結構有時被稱為「好萊塢法則」 ,即「別找我們,,我們找你」通過乙個父類呼叫其子類的操作(而不是相反的子類呼叫父類),通過對子類的擴充套件增加新的行為,符合「開閉原則」
缺點:
每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象,但是更加符合「單一職責原則」,使得類的內聚性得以提高。
總結:
1)模板方法模式是一種類的行為型模式,在它的結構圖中只有類之間的繼承關係,沒有物件關聯關係。
2)板方法模式是基於繼承的**復用基本技術,模板方法模式的結構和用法也是物件導向設計的核心之一。在模板方法模式中,可以將相同的**放在父類中,而將不同的方法實現放在不同的子類中。
3)在模板方法模式中,我們需要準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來讓子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現,這就是模板方法模式的用意。模板方法模式體現了物件導向的諸多重要思想,是一種使用頻率較高的模式。
**示例:
/**
* 模板方法中的父類,prepare方法定義了演算法步驟,不同的飲料需要實現不同的brew,並可以選擇是否覆蓋food方法
* * @author sky
* */
public abstract class beverage
final public void boilwater()
abstract void brew();
final public void pourincup()
public void food()
}/**
* 咖啡,實現了brew方法
* * @author sky
* */
public class coffee extends beverage
}/**
* 茶,實現了brew方法,重寫了food方法
* * @author sky
* */
public class tea extends beverage
@override
void brew()
}/**
* 測試類
* * @author sky
* */
public class test
}輸出:
---茶---
燒水 沖茶
將飲料倒入杯子裡
喝茶不需要搭配糕點
---咖啡---
燒水 衝咖啡
將飲料倒入杯子裡
搭配一點糕點
模板方法模式
有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...
模板方法模式
模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...
模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...