Template Method介绍
- 定义一个操作中算法的骨架, 将一些具体在步骤的实现延迟到子类, 即可以在不改变一个算法的结构的基础上,通过子类就可以重定义算法的某些特定步骤;
适用性
- 一次性定义了一个算法的固定部分, 将可变的部分留给来实现;
- 将子类中的重复的行为提取到父类中来以避免代码的重复;
- 控制子类的扩展;
理解
- 简单来说,就是将子类中共用的行为提取出来做成一个模板方法放在基类中, 并由子类实现特定的行为来填补模板;
例子
- 情人节到了, 小明想要为小梦做道烛光晚餐CandleLightDinner, 于是小明跑到超市买了菜BuyFood()准备做一道小梦最爱吃的香菇炖鸡ChickenMushroom, 并去蛋糕店订了一个水果蛋糕FriutCake, 然后又去花店订了一束花BookFlowers(); 最后就是和小梦一起享受烛光晚餐了;
代码
class CandleLightDinner
{
public:
void TmpltForPrepareDinner()
{
PrimBuyFood();
PrimCookFood();
PrimBookCacke();
PrimBookFlowers();
}
protected:
virtual void PrimBuyFood() = 0;
virtual void PrimCookFood() = 0;
virtual void PrimBookCacke() = 0;
virtual void PrimBookFlowers() = 0;
};
class DinnerForMingAndMeng : public CandleLightDinner
{
public:
virtual void PrimBuyFood()
{
cout<<"xiaoming go to supermarket buy Chicken and mushrooms"<<endl;
}
virtual void PrimCookFood()
{
cout<<"xiaoming is cooking the ChickenMushroom" <<endl;
}
virtual void PrimBookCacke()
{
cout<<"xiaoming is booking a fruitCake"<<endl;
}
virtual void PrimBookFlowers()
{
cout<<"xiaoming is booking a rose for xiaomeng"<<endl;
}
};
int main()
{
CandleLightDinner* dinner = new DinnerForMingAndMeng;
dinner->TmpltForPrepareDinner();
return 0;
}
总结
- 如上面的例子所示, 男朋友为女朋友自己准备烛光晚餐, 则可能会有一套固定的流程:买菜做对方最爱的菜, 做菜, 买个蛋糕, 订花, 而对于不同的情侣, 具体最爱吃什么菜, 喜欢什么花, 蛋糕都是不一样的,这时将整个流程提取出来, 对于具体的细节则由各个情侣子类自己去实现, 父类的模板方法中只调用纯虚函数接口即可.