模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。还可以使用钩子对可选部分进行判断。
#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;
else
return 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;
else
return 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;
}