zoukankan      html  css  js  c++  java
  • 模版方法模式Template Mothod -- 学习HeadFirst设计模式记录

     

    模版方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

     

    这个模式主要用来创建一个算法的模版。

     

    好莱坞原则:别调用(打电话)我们,我们会调用(打电话)你;

     

    应用案例:

    数组排序算法 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;
    }

     

  • 相关阅读:
    常见数据结构和算法 的可视化
    JSON与XML
    JavaScript 中的陷阱
    C++ primer(十三)--类继承、构造函数成员初始化、虚函数、抽象基类
    mongodb学习(二)
    再谈怎样以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式
    LaTeX Subfigure 中间加入垂直线
    JAVA基础针对自己薄弱环节总结02(循环)
    软考之路--用文字记录这个漂亮的进程
    mysql异常Lock wait timeout exceeded; try restarting transaction
  • 原文地址:https://www.cnblogs.com/ant-wjf/p/4638555.html
Copyright © 2011-2022 走看看