zoukankan      html  css  js  c++  java
  • [C++设计模式]template 模板方法模式

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

    依照《headfirst 设计模式》的样例。煮茶和煮咖啡的算法框架(流程)是一样的。仅仅是有些算法的实现是不一样的,有些是一样的。


    我们能够将共同的算法框架封装为一个虚基类,将同样的算法声明为不可覆盖的(static)。不同的算法声明为子类要实现的纯虚函数。
    能够使用hook()函数处理算法框架的细小差异。

    看到这里,也许会想起策略模式。

    策略模式也是将能够改变的算法和不轻易改变的算法差别对待,但策略模式和模板方法模式的最根本差别是:
    策略模式是採用类组合,将不变的算法仍保留在原来类中。仅仅是将要重载的算法单独封装为一个虚基类,子类实现自己的版本号,这样原来的类就
    能够组合不同的接口子类。调用不同的算法。
    模板方法模式是採用类继承,将算法框架(步骤)封装为一个虚基类,并且算法框架是不可覆盖的,子类仅仅能对个别步骤有不同的实现。基类也能够引入hook()函数来对算法框架微调。hook()钩子函数的原理非常easy,基类的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;
    }



  • 相关阅读:
    baidu 地图 鼠标移上显示标签 鼠标离开隐藏标签
    ci框架 用框架自带db 添加括号,比如 like 等等左右添加括号 解决办法
    layDate 闪现 循环一个以上会闪现
    typescript定义函数类型
    typescript中的类与接口的关系
    typescript中的类
    typescript中的接口
    mac 上配置 ssh 免密登录服务器 【非常简单】
    Go语言中的map(十一)
    Go语言中的切片(十)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6751775.html
Copyright © 2011-2022 走看看