模板方法模式

来源:互联网 发布:笔记本外置光驱 知乎 编辑:程序博客网 时间:2024/06/05 03:49

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。还可以使用钩子对可选部分进行判断。

#include <iostream>#include <string>using namespace std;class CaffeineBeverage{public:void prepareRecipe(){boilWater();brew();pourInCup();addCondiments();}virtual void brew(){}virtual void addCondiments(){ }void boilWater(){cout << "Boiling water "<< endl;}void pourInCup(){cout << "Pouring into cup" << endl;}};class Tea : public CaffeineBeverage{public :virtual void brew(){cout << "Steeping the tea" << endl;}virtual void addCondiments(){cout << "Adding Lemon" << endl;}};class Coffee : public CaffeineBeverage{public: virtual void brew(){cout << "Dripping Coffee through filter" << endl;}virtual void addCondiments(){cout << "Adding Sugar and Milk" << endl;}};class CaffeineBeverageWithHook{public:void prepareRecipe(){boilWater();brew();pourInCup();if(customerWantCondiments()){addCondiments();}}virtual void brew() { }virtual void addCondiments() { }void boilWater(){cout << "Boiling water" <<endl;}void pourInCup(){cout << "Pouring into cup" << endl;}virtual bool customerWantCondiments(){return true;}};class CaffeeWithHook : public CaffeineBeverageWithHook{public:virtual void brew(){cout << "Dripping Coffee through filter" << endl;}virtual void addCondiments(){cout << "Adding Sugar and Milk" << endl;}bool customerWantCondiments(){string answer = getUserInput();if(*(answer.c_str()) == 'y' || *(answer.c_str()) == 'Y')return true;elsereturn false;}private:string getUserInput(){string answer = " ";cout << "Would you like milk and sugar with your coffee(y/n)?" << endl;cin >> answer;if(answer == " ")return "no";return answer;}};class TeaWithHook : public CaffeineBeverageWithHook{public:virtual void brew(){cout << "Steeping the tea" << endl;}virtual void addCondiments(){cout << "Adding Lemon" << endl;}bool customerWantCondiments(){string answer = getUserInput();if(*(answer.c_str()) == 'y' || *(answer.c_str()) == 'Y')return true;elsereturn false;}private:string getUserInput(){string answer = " ";cout << " Would you like milk and sugar with your coffee(y/n)?" << endl;cin >> answer;if(answer == " ")return "no";return answer;}};int main(){TeaWithHook* teaHook = new TeaWithHook();CaffeeWithHook* caffeeHook = new CaffeeWithHook();cout << "\nMaking tea..." << endl;teaHook->prepareRecipe();cout << "\nMaking coffee..."<< endl;caffeeHook->prepareRecipe();return 0;}


原创粉丝点击