设为首页 加入收藏

TOP

[C++设计模式]template 模板方法模式
2015-07-22 20:10:03 来源: 作者: 【 】 浏览:19
Tags:设计模式 template 模板 方法 模式

模板法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。

按照《headfirst 设计模式》的例子,煮茶和煮咖啡的算法框架(流程)是一样的,只是有些算法的实现是不一样的,有些是一样的。
我们可以将共同的算法框架封装为一个虚基类,将相同的算法声明为不可覆盖的(static),不同的算法声明为子类要实现的纯虚函数。
可以使用hook()函数处理算法框架的细小差异。

看到这里,或许会想起策略模式。策略模式也是将可以改变的算法和不轻易改变的算法区别对待,但策略模式和模板方法模式的最根本区别是:
策略模式是采用类组合,将不变的算法仍保留在原来类中,只是将要重载的算法单独封装为一个虚基类,子类实现自己的版本,这样原来的类就
可以组合不同的接口子类,调用不同的算法。
模板方法模式是采用类继承,将算法框架(步骤)封装为一个虚基类,而且算法框架是不可覆盖的,子类只能对个别步骤有不同的实现。基类也可以引入hook()函数来对算法框架微调。hook()钩子函数的原理很简单,基类的hook()函数可以定义为空,也可以定义一些操作,子类可以对基类的hook()函数进行重载。
?

\

下面是不带hook()钩子的模板方法模式:

?

class CaffeineBeverage  //咖啡因饮料
{
public:
 void PrepareRecipe() //咖啡因饮料冲泡法
 {
  BoilWater();  //把水煮沸
  Brew();    //冲泡
  PourInCup();  //把咖啡因饮料倒进杯子
  AddCondiments(); //加调料
 }
 void BoilWater()
 {std::cout << 把水煮沸 << std::endl;}
 virtual void Brew() = 0;
 void PourInCup()
 {std::cout << 把咖啡倒进杯子 << std::endl;}
 virtual void AddCondiments() = 0;
};
class Coffee : public CaffeineBeverage
{
public:
 void Brew()
 {std::cout << 用沸水冲泡咖啡 << std::endl;}
 void AddCondiments()
 {std::cout << 加糖和牛奶 << std::endl;}
};
class Tea : public CaffeineBeverage
{
public:
 void Brew()
 {std::cout << 用沸水浸泡茶叶 << std::endl;}
 void AddCondiments()
 {std::cout << 加柠檬 << std::endl;}
};
int main(void)
{
 std::cout << 冲杯咖啡: << std::endl;
 Coffee c;
 c.PrepareRecipe();
 std::cout << std::endl;
 std::cout << 冲杯茶: << std::endl;
 Tea t;
 t.PrepareRecipe();
 return 0;
}

?
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu5294||2015多校联合第一场1007.. 下一篇hdu 5289 Assignment

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: