模板方法模式
来源:互联网 发布:笔记本外置光驱 知乎 编辑:程序博客网 时间: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;}
- 深入浅出模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法设计模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- TemplateMethod模板方法模式
- 模板方法模式
- 模板方法模式
- 模板方法模式
- XML的编程
- Format Date in Custom Drop Down List in Ext.Net
- linux c中select使用技巧
- King 差分约束系统
- sql语句字段值包含字符串问题
- 模板方法模式
- 排序算法
- 我的纯玻璃
- Eclipse PHP插件安装与配置
- 使用WCF Service Web Role
- JDK5 获取线程返回结果
- Android开发遇到的问题笔记(持续更新)
- 计算几何
- 移动互联网数据分析 移动客户端流量统计 移动客户端数据统计(一)