设计模式:模板方法模式(C++)【喝咖啡还是喝茶】
生活随笔
收集整理的這篇文章主要介紹了
设计模式:模板方法模式(C++)【喝咖啡还是喝茶】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
模板方法模式介紹
我們在軟件設計中經常會有一些步驟是一樣的,只是實現不一樣,這種情況我們就可以使用模板方法模式。何為模板,就是有固定的步驟,可以復用嘛。來看看模板方法模式:定義一個操作中的算法的骨架,而將一些步驟延遲到子類。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些步驟。舉個簡單例子,拿我們泡茶和泡咖啡來說,都有 煮水、醞釀、沖泡咖啡、添加調料等 ,都是由固定步驟,但是他們的實現可能不一樣。這種情況,模板方法模式最合適了。
模板方法標準模型圖
模型圖 很簡單,主要就是將不確定的實現 進行抽象,抽象類的模板方法按照固定步驟 調用還未實現的抽象方法。
喝咖啡還是喝茶案例
我們以沖泡咖啡和茶,來學習模板方法模式。
模型圖
代碼實現
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class AbstractMakeDrinks { public://水virtual void BoidWater() = 0;//醞釀virtual void Brew() = 0;//倒入杯中virtual void PourInCup() = 0;//添加調料virtual void AddSomething() = 0;//鉤子函數 可控制 是否執行某部分算法virtual bool IsAddSomething(){return true;}//模板方法 根據套路生產飲料,套路(框架)已經確定void MakeDrinks(){//1、煮水BoidWater();//2、醞釀飲料Brew();//3、倒入杯中PourInCup();//其余部分算法可以通過鉤子函數進行控制 是否執行//4、添加調料if (IsAddSomething()){AddSomething();}cout << endl;} }; class Tea :public AbstractMakeDrinks { public:Tea():isAddCondiment(false){}Tea(bool isAddCondiment){this->isAddCondiment = isAddCondiment;}//水virtual void BoidWater(){cout << "煮農夫山泉水 ";}//醞釀virtual void Brew(){cout << "->沖泡鐵觀音 ";}//倒入杯中virtual void PourInCup(){cout << "->倒入茶杯中 ";}//添加調料virtual void AddSomething(){cout << "->加點檸檬 ";}//鉤子函數 可控制 是否執行某部分算法virtual bool IsAddSomething(){return this->isAddCondiment;} private:bool isAddCondiment = false;//是否添加調料 ,默認是原生態 }; class Coffee :public AbstractMakeDrinks { public:Coffee() :isAddCondiment(false){}Coffee(bool isAddCondiment){this->isAddCondiment = isAddCondiment;}//水virtual void BoidWater(){cout << "煮自來水 ";}//醞釀virtual void Brew(){cout << "->沖泡咖啡 ";}//倒入杯中virtual void PourInCup(){cout << "->倒入咖啡杯中 ";}//添加調料virtual void AddSomething(){cout << "->加點糖、牛奶 " << endl;}//鉤子函數 可控制 是否執行某部分算法virtual bool IsAddSomething(){return this->isAddCondiment;} private:bool isAddCondiment = false;//是否添加調料 ,默認是原生態 };//根據模板方法 生成東西 void GetDrinks(AbstractMakeDrinks* drink) {drink->MakeDrinks(); }int main(int argc, char *argv[]) {//獲取一杯 原生態茶cout << "原生態茶制作:" << endl;GetDrinks(new Tea);//帶調料的cout << "加料的茶制作:" << endl;GetDrinks(new Tea(true));//獲取一杯 原生態咖啡cout << "原生態咖啡制作:" << endl;GetDrinks(new Coffee);cout << "加料的咖啡制作:" << endl;//帶調料的GetDrinks(new Coffee(true));return EXIT_SUCCESS; }運行結果
總結
以上是生活随笔為你收集整理的设计模式:模板方法模式(C++)【喝咖啡还是喝茶】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双系统windows10扩容ubuntu
- 下一篇: C/C++定时器制作