模板想必大家在生活中是經常用的。比如說寫簡歷可以套乙個簡歷模板,寫乙個網頁可以套乙個前端模板。當你使用乙個模板的時候,你會根據自己的需求去修改模板的一部分內容。對於模板方法的使用和設計,與現實中的模板是基本一致的。這也是為什麼它叫這個名字。
接下來我們考慮乙個場景:用程式實現乙個人一天的活動流程,包括吃早飯,吃午飯,打籃球,吃晚飯,跑步。這裡限定吃飯的函式總是不變的
一開始你可能會寫出如下**,這是很自然的想法。
class eatvoid eatlunch() {}
void eatdinner() {}
};class dosport
void running() {}
};int main()
那麼如果用模板方法模式來寫呢?**如下:
// dayinlife是乙個模板class dayinlife
virtual void playbasketball() = 0;
virtual void running() = 0;
private:
void eatbreakfast()
void eatlunch()
void eatdinner()
};class myday : public dayinlife
void running()
}int main()
那麼問題來了,使用模板方法到底有什麼好處呢?
假設這個關於活動流程的類都是別人開發的,而你要使用這些類來實現你自己的功能。如果這些類是以第一種方式設計的,那麼你每次寫關於某個人一天的流程你都要把吃飯的動作給寫上,比如說
// 第乙個人的一天
eat e;dosport ds;
e.eatbreakfast();
e.eatlunch();
ds.playbasketball();
e.eatdinner();
ds.running();
// 第二個人的一天, 因為每個人打籃球和跑步的方式不同所以你又設計了乙個dosport類
dosport2 ds2;e.eatbreakfast();
e.eatlunch();
ds2.playbasketball();
e.eatdinner();
ds2.running();
你知道對於每個人,他們的吃飯動作或者說函式都是一樣的(場景設定的),你可能會自己封裝乙個函式
void onedayinlife(dosport* dosport)
但不管哪種方式,這些流程你都要來寫一遍。然而這些流程是固定的,其中唯一有變化的地方只是人們運動的方式不一樣,那麼更好的想法是這些類的開發者把這些固定的動作封裝起來,而把變化的部分暴露給使用者,讓使用者根據自己的需求來自定義動作。這樣子main中的**也變得簡潔了很多!
總的來說,如果這些類都是給自己使用的話,完全可以不用模板模式。然而考慮給別人用的話,那麼使用者就會獲得很大的便利。這就是設計模式的好處,方便類的使用者來開發程式!
模板設計模式 設計模式 模板方法模式
在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...
設計模式 模板方法設計模式
物件導向,萬物皆物件,用乙個雷來反應現實生活中的東西。比如銀行系統,業務公升級 活期 定期,差別很小,就加判斷 違背單一職責 差別比較多,尤其是模擬較複雜,型別拆分下。拆分之後,自然就有父類,重用。利率 每個客戶端都有利率,但是各不一樣 抽象方法。show 不分客戶端是一樣的,個別客戶端是不一樣的 ...
設計模式 模板方法模式
模板方法模式 類庫中大量使用,例如idbconnection介面 dbconnection抽象類 派生的sqlconnection和派生的oledbconnection就是使用了這種方法 1。介面,到能做的定義進來。一種規範 2.把共同的部分進去分離出來,放到乙個抽象的父類去實現.3.子類中實現 不...