设计模式:模板方法模式(C++)【喝咖啡还是喝茶】
生活随笔
收集整理的這篇文章主要介紹了
设计模式:模板方法模式(C++)【喝咖啡还是喝茶】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
模板方法模式介紹
我們?cè)谲浖O(shè)計(jì)中經(jīng)常會(huì)有一些步驟是一樣的,只是實(shí)現(xiàn)不一樣,這種情況我們就可以使用模板方法模式。何為模板,就是有固定的步驟,可以復(fù)用嘛。來(lái)看看模板方法模式:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些步驟。舉個(gè)簡(jiǎn)單例子,拿我們泡茶和泡咖啡來(lái)說(shuō),都有 煮水、醞釀、沖泡咖啡、添加調(diào)料等 ,都是由固定步驟,但是他們的實(shí)現(xiàn)可能不一樣。這種情況,模板方法模式最合適了。
模板方法標(biāo)準(zhǔn)模型圖
模型圖 很簡(jiǎn)單,主要就是將不確定的實(shí)現(xiàn) 進(jìn)行抽象,抽象類(lèi)的模板方法按照固定步驟 調(diào)用還未實(shí)現(xiàn)的抽象方法。
喝咖啡還是喝茶案例
我們以沖泡咖啡和茶,來(lái)學(xué)習(xí)模板方法模式。
模型圖
代碼實(shí)現(xiàn)
#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;//添加調(diào)料virtual void AddSomething() = 0;//鉤子函數(shù) 可控制 是否執(zhí)行某部分算法virtual bool IsAddSomething(){return true;}//模板方法 根據(jù)套路生產(chǎn)飲料,套路(框架)已經(jīng)確定void MakeDrinks(){//1、煮水BoidWater();//2、醞釀飲料Brew();//3、倒入杯中PourInCup();//其余部分算法可以通過(guò)鉤子函數(shù)進(jìn)行控制 是否執(zhí)行//4、添加調(diào)料if (IsAddSomething()){AddSomething();}cout << endl;} }; class Tea :public AbstractMakeDrinks { public:Tea():isAddCondiment(false){}Tea(bool isAddCondiment){this->isAddCondiment = isAddCondiment;}//水virtual void BoidWater(){cout << "煮農(nóng)夫山泉水 ";}//醞釀virtual void Brew(){cout << "->沖泡鐵觀音 ";}//倒入杯中virtual void PourInCup(){cout << "->倒入茶杯中 ";}//添加調(diào)料virtual void AddSomething(){cout << "->加點(diǎn)檸檬 ";}//鉤子函數(shù) 可控制 是否執(zhí)行某部分算法virtual bool IsAddSomething(){return this->isAddCondiment;} private:bool isAddCondiment = false;//是否添加調(diào)料 ,默認(rèn)是原生態(tài) }; class Coffee :public AbstractMakeDrinks { public:Coffee() :isAddCondiment(false){}Coffee(bool isAddCondiment){this->isAddCondiment = isAddCondiment;}//水virtual void BoidWater(){cout << "煮自來(lái)水 ";}//醞釀virtual void Brew(){cout << "->沖泡咖啡 ";}//倒入杯中virtual void PourInCup(){cout << "->倒入咖啡杯中 ";}//添加調(diào)料virtual void AddSomething(){cout << "->加點(diǎn)糖、牛奶 " << endl;}//鉤子函數(shù) 可控制 是否執(zhí)行某部分算法virtual bool IsAddSomething(){return this->isAddCondiment;} private:bool isAddCondiment = false;//是否添加調(diào)料 ,默認(rèn)是原生態(tài) };//根據(jù)模板方法 生成東西 void GetDrinks(AbstractMakeDrinks* drink) {drink->MakeDrinks(); }int main(int argc, char *argv[]) {//獲取一杯 原生態(tài)茶cout << "原生態(tài)茶制作:" << endl;GetDrinks(new Tea);//帶調(diào)料的cout << "加料的茶制作:" << endl;GetDrinks(new Tea(true));//獲取一杯 原生態(tài)咖啡cout << "原生態(tài)咖啡制作:" << endl;GetDrinks(new Coffee);cout << "加料的咖啡制作:" << endl;//帶調(diào)料的GetDrinks(new Coffee(true));return EXIT_SUCCESS; }運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的设计模式:模板方法模式(C++)【喝咖啡还是喝茶】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 双系统windows10扩容ubuntu
- 下一篇: Python黑客编程3网络数据监听和过滤