模版方法模式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;
}

 

 

posted on 2015-07-11 14:08  Waaaaaall-E  阅读(179)  评论(0编辑  收藏  举报

导航