在模板方法模式(template pattern)中,乙個抽象類公開定義了執行它的方法的方式/模板。例如,乙個人每天會起床、吃飯、做事、睡覺等,其中「吃飯」和「做事」的內容每天可能不同。
意圖:定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
主要解決:一些方法通用,卻在每乙個子類都重新寫了這一方法。
何時使用:有一些通用的方法。
如何解決:將這些通用演算法抽象出來。
關鍵**:在抽象類實現,其他步驟在子類實現。
優點:1、封裝不變部分,擴充套件可變部分。 2、提取公共**,便於維護。 3、行為由父類控制,子類實現。
缺點:每乙個不同的實現都需要乙個子類來實現,導致類的個數增加,使得系統更加龐大。
使用場景:1、有多個子類共有的方法,且邏輯相同。 2、重要的、複雜的方法,可以考慮作為模板方法。
模板方法模式包含以下主要角色:
(1) 抽象類(abstract class):負責給出乙個演算法的輪廓和骨架。它由乙個模板方法和若干個基本方法構成。這些方法的定義如下:
① 模板方法:定義了演算法的骨架,按某種順序呼叫其包含的基本方法。
② 基本方法:是整個演算法中的乙個步驟,包含以下幾種型別:
1.抽象方法:在抽象類中申明,由具體子類實現。
2.具體方法:在抽象類中已經實現,在具體子類中可以繼承或重寫它。
3.鉤子方法:在抽象類中已經實現,包括用於判斷的邏輯方法和需要子類重寫的空方法兩種。
(2) 具體子類(concrete class):實現抽象類中所定義的抽象方法和鉤子方法,它們是乙個頂級邏輯的乙個組成步驟。
模板方法模式的結構圖如圖所示:
實現:
/**
* * @classname: shop
* @description: 抽象模板角色
* @author: ljx
* @date: 2023年4月16日 上午10:51:18
*/public abstract class shop
/***
* @title: dogetshoptype
* @description: 基本方法(鉤子方法)留給子類實現,得到客戶型別
* @return
* @return: string
*/protected string dogetshoptype()
/***
* @title: accountdiscount
* @description:基本方法(抽象方法)留給子類實現,計算折扣 不同型別的客戶折扣不同
* @return
* @return: double
*/protected abstract double accountdiscount();
/***
* @title: price
* @description: 基本方法(具體方法),已經實現,計算原價
* @param price
* @return
* @return: double
*/protected double price(double price); }
/** *
* @classname: commonclient
* @description: 具體模板角色:普通客戶
* @author: ljx
* @date: 2023年4月16日 上午11:02:23
*/public class commonclient extends shop
}/**
* * @classname: memberclicent
* @description: 具體模板角色:會員客戶
* @author: ljx
* @date: 2023年4月16日 上午11:08:45
*/public class memberclicent extends shop
@override
public string dogetshoptype()
}public class templateteset
}
結果為:
客戶型別:null,所需金額為:10000.0
客戶型別:會員客戶,所需金額為:5000.0
... ...,歡迎指正!
模板方法模式
有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...
模板方法模式
模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...
模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...