模板方法模式
在一个方法中,定义一个算法的骨架,而将一个些步骤延迟到子类中。
模板方法使得子类在不改变算法结构的情况下,重新定义一些算法中的某些步骤。
创建一个算法的模板,模板就是一个方法,在方法中将算法定义成一组步骤。其中任何步骤都可以是抽象的,由子类负责实现。
使得 模板方法本身 和 模板中操作的具体实现 解耦。
class CaffeinBeverage{
virtual void prepareRecipe() final{
boilWater();
brew();
pourInCup();
addCondiments();
}
virtual void brew()=0;
virtual void addCondiments()=0;
void boilWater(){
cout << "Boiling water" << endl;
}
void pourInCup(){
cout << "pour Into Cup" << endl;
}
};
class Coffe : public CaffeinBeverage{
public:
void brew(){ // brewCoffeeGrinds(){
cout << "Dripping Coffee through filter" << endl;
}
void addCondiments(){ // addSugarAndMilk(){
cout << "Adding Sugar and Milk" << endl;
}
};
class Tea : public CaffeinBeverage{
public:
void brew(){ // steepTeaBag(){
cout << "Steeping the tea" << endl;
}
void addCondiments(){ // addLemon(){
cout << "Pouring into cup" << endl;
}
};
钩子作为条件控制:
class CaffeinBeverageWithHook{
public:
void prepareRecipe() final{
boilWater();
brew();
pourInCup();
if(customerWantsCondiments()) addCondiments();
}
bool customerWantsCondiments(){ // 钩子
cout << "Would you like milk and sugar with your coffee(Y/N)"<< endl;
char yesOrNo = 'N';
cin >> yesOrNo;
`
if(yesOrNo == 'Y')
return true;
return false;
}
};
通过继承的方式复用代码, 并保持对算法的控制。