模板方法模式
- 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的一些步骤。
- 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现
- 模板方法的抽象类可以定义具体方法,抽象方法和钩子,抽象方法由子类实现,钩子是一种方法,它在抽象类中不做事,或者只做默认的事,子类可以选择要不要去覆盖它。
- 模板方法中涉及的设计原则:好莱坞原则,别调用我们,我们会调用打电话给你。
模式 | 叙述 |
---|---|
模板方法 | 封装可互换的行为,然后使用委托来决定要采用哪一个行为 |
策略 | 子类决定如何实现算法中的步骤 |
工厂方法 | 由子类决定实例化那个具体子类 |
例子
class CaffeineBeverage{
public:
~CaffeineBeverage(){}
virtual void prepareRecipe(){
boilWater();
brew();
pourIncup();
if(isAddCondiments()){ //钩子用来改变算法中的步骤 可以由子类重定义
addCondiments();
}
}
protected:
void boilWater(){
cout<<" add boil water"<<endl;
}
virtual void brew()=0;
void pourIncup(){
cout<<"pour beverage in cup "<<endl;
};
virtual void addCondiments()=0;
bool isAddCondiments(){
char ans;
cout<<" Add condiments? Y/N "<<endl;
cin>>ans;
if(ans=='Y'){
return true;
}
return false;
}
};
class Tea:public CaffeineBeverage{
private:
virtual void brew(){
cout<<" steeping the tea"<<endl;
}
virtual void addCondiments(){
cout<<"Adding Lemon"<<endl;
}
};
class Coffee:public CaffeineBeverage{
private:
virtual void brew(){
cout<<" Dripping Coffe through filter"<<endl;
}
virtual void addCondiments(){
cout<<"Adding Sugar and Milk"<<endl;
}
};
int main(){
CaffeineBeverage* beverage = new Tea;
beverage->prepareRecipe();
cout<<endl;
beverage = new Coffee;
beverage->prepareRecipe();
system("pause");
return 0;
}