模版方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
这个模式主要用来创建一个算法的模版。
好莱坞原则:别调用(打电话)我们,我们会调用(打电话)你;
应用案例:
数组排序算法 void sort(Object[] a),其中入参对象必须实现compareTo(Object o)方法,即入参对象必须实现Comparable接口。
模式演示 代码:
#include <iostream>
/* caffeine:咖啡因, beverage:饮料 */
class CaffeineBeverage
{
public:
/*算法模版*/
void PrepareRecipe()
{
BoilWater(); // 烧水
Brew(); // 冲泡
PourInCup(); // 倒入杯子
AddCondiments(); // 添加调料
}
void BoilWater()
{
std::cout<<"Boiling water."<<std::endl;
}
void PourInCup()
{
std::cout<<"Pouring into cup."<<std::endl;
}
virtual void Brew() {}; // 虚函数,子类必须实现
virtual void AddCondiments() {};
void Hook() {} // 钩子函数,提供默认实现,子类选择实现
};
/* 基于模版方法煮咖啡,只实现虚函数 */
class Tea : public CaffeineBeverage
{
public:
virtual void Brew()
{
std::cout<<"Dripping coffee through filter."<<std::endl;
}
virtual void AddCondiments()
{
std::cout<<"Adding suger and milk."<<std::endl;
}
};
/* 基于模版方法煮茶,只实现虚函数 */
class Coffer : public CaffeineBeverage
{
public:
virtual void Brew()
{
std::cout<<"Steeping the tea."<<std::endl;
}
virtual void AddCondiments()
{
std::cout<<"Adding lemon."<<std::endl;
}
};
int main()
{
std::cout<<"Template Method"<<std::endl;
Coffer coffer;
coffer.PrepareRecipe();
Tea tea;
tea.PrepareRecipe();
return 0;
}