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

 

 

你可能感兴趣的:(template)