模板方法模式:在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
这个模式比较简单,下面先来看咖啡和茶的例子:
#include <iostream>
using namespace std;
class CaffeineBeverage{
public:
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 << "Pouring into cup" << endl;
}
};
class Tea :public CaffeineBeverage{
public:
void brew(){
cout << "Steeping the tea" << endl;
}
void addCondiments(){
cout << "Adding Lemon" << endl;
}
};
class Coffee :public CaffeineBeverage{
public:
void brew(){
cout << "Dropping coffee through filter" << endl;
}
void addCondiments(){
cout << "Adding Sugar and Milk" << endl;
}
};
int main(){
Tea *myTea = new Tea();
myTea->prepareRecipe();
delete myTea;
}
对模板方法进行挂钩:
#include <iostream>
#include <string>
using namespace std;
class CaffeineBeverage{
public:
virtual void prepareRecipe() final { //模板方法
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) //加上条件语句(挂钩核心部分)
{
addCondiments();
}
}
virtual void brew() = 0;
virtual void addCondiments() = 0;
void boilWater(){
cout << "Boiling water" << endl;
}
void pourInCup(){
cout << "Pouring into cup" << endl;
}
virtual bool customerWantsCondiments(){ //子类可以覆盖这个方法
return true;
}
};
class Tea :public CaffeineBeverage{
public:
void brew(){
cout << "Steeping the tea" << endl;
}
void addCondiments(){
cout << "Adding Lemon" << endl;
}
bool customerWantsCondiments(){
char answer = getUserInput();
if (answer == 'y')
return true;
else
return false;
}
char getUserInput(){
char answer;
cout << "Could you like milk and sugar with your coffee (y/n)? ";
cin >> answer;
return answer;
}
};
class Coffee :public CaffeineBeverage{
public:
void brew(){
cout << "Dropping coffee through filter" << endl;
}
void addCondiments(){
cout << "Adding Sugar and Milk" << endl;
}
};
int main(){
Tea *myTea = new Tea();
myTea->prepareRecipe();
delete myTea;
}