设计模式 -- 模板方法模式 TemplateMethod

来源:互联网 发布:中国的软件行业 编辑:程序博客网 时间:2024/04/30 15:44

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

核心:通过把不变的行为放到基类,去除子类中的重复代码达到复用的目的。但是,具体的步骤已经在基类中写好了,子类只是有不同的实现罢了。

一个小技巧,钩子的使用可以使得算法更灵活。

小例子:喝茶 or 喝咖啡

//基类:饮料class Beverage {public:    virtual void prepareRecipe()    {        boilWater();        brew();        pourIntoCup();        //钩子代码:判断是否需要加料,毕竟有些人喜欢喝茶喝咖啡不加任何东东        if(wantCondiments())        {            addCondiments();        }    }    void boilWater() { cout << "煮水" << endl; }    virtual void brew() = 0;    void pourIntoCup() { cout << "把水倒入杯子中" << endl; }    virtual void addCondiments() = 0;    //钩子代码:虚函数,wantCondiments(),子类根据不同需要去实现;默认是true    virtual bool wantCondiments() { return true; }};//子类:咖啡class Coffee : public Beverage {public:    void brew() { cout << "冲咖啡" << endl; }    void addCondiments() { cout << "加糖和牛奶" << endl; }    bool wantCondiments() { return false; }};//子类:茶class Tea : public Beverage {public:    void brew() { cout << "泡茶" << endl; }    void addCondiments() { cout << "加柠檬" << endl; }};int main(){    //小米喜欢喝咖啡,不加料    Beverage *xiaomiCoffee = new Coffee();    xiaomiCoffee->prepareRecipe();    cout << endl;    //大米喜欢喝茶,加料    Beverage *damiTea = new Tea();    damiTea->prepareRecipe();    return 0;}/*煮水冲咖啡把水倒入杯子中煮水泡茶把水倒入杯子中加柠檬 */



原创粉丝点击