Template Method模式
作用:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMetho
d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML结构图:
现在看具体例子 泡茶喝泡咖啡
直观的印象:
现在将preparereceipt 方法抽象
brew和 addCondiments 方法是有区别的 所以 要声明为虚函数,由子类实现,也就是由子类重新定义了步骤:
最终的样子
#include <iostream> using namespace std; class caffeineBeverage { public: caffeineBeverage(){} virtual ~caffeineBeverage(){} void prepareReceipt(){ boilWater(); brew(); pourInCup(); addCondiments(); } void boilWater(){ cout<<"Boiling Water"<<endl; } void pourInCup(){ cout<<"Pour in the cup"<<endl; } protected: virtual void brew()=0; virtual void addCondiments ()=0; }; class Coffee: public caffeineBeverage { public: Coffee(){cout<<"Making Coffee..."<<endl;} virtual ~Coffee(){} protected: virtual void brew(){ cout<<"Dripping coffee through filter "<<endl; } virtual void addCondiments(){ cout<<"Adding sugar and milk"<<endl; } }; class Tea: public caffeineBeverage { public: Tea(){ cout<<"Making Tea..."<<endl;} virtual ~Tea(){} protected: virtual void brew(){ cout<<"Dripping tea through filter "<<endl; } virtual void addCondiments(){ cout<<"Adding lemon"<<endl; } }; int main(void) { caffeineBeverage * coffee = new Coffee(); coffee->prepareReceipt(); cout<<endl; caffeineBeverage * tea = new Tea(); tea->prepareReceipt(); return 0; }