设计模式之模板方法模式

来源:互联网 发布:淘宝快速提升销量 编辑:程序博客网 时间:2024/06/03 08:58

一、模式动机

  为了提高代码复用,定义了算法的步骤,而这些步骤的具体实现延迟到子类中。

二、模式定义

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

这里写图片描述

三、模式示例

   下图是星巴兹咖啡师傅的训练手册,用模板方法模式来实现。

这里写图片描述

C++代码实现:

#include <iostream>using namespace std;class CaffeeineBeverage{public:    CaffeeineBeverage();    ~CaffeeineBeverage();    void boilWater() { cout << "把水煮沸" << endl; }    void pourInCup() { cout << "倒进杯子" << endl; }    virtual void brew() = 0;    virtual void addCondiments() = 0;    void preparreRecip() { boilWater(); brew(); pourInCup(); addCondiments(); }private:};CaffeeineBeverage::CaffeeineBeverage(){}CaffeeineBeverage::~CaffeeineBeverage(){}class Tea : public CaffeeineBeverage{public:    Tea();    ~Tea();    void brew() { cout << "用沸水浸泡茶叶" << endl; }    void addCondiments() { cout << "加柠檬" << endl; }private:};Tea::Tea(){}Tea::~Tea(){}class Coffee : public CaffeeineBeverage{public:    Coffee();    ~Coffee();    void brew() { cout << "用沸水冲泡咖啡" << endl; }    void addCondiments() { cout << "加糖和牛奶" << endl; }private:};Coffee::Coffee(){}Coffee::~Coffee(){}int _tmain(int argc, _TCHAR* argv[]){    Tea MyTea;    Coffee MyCoffee;    MyTea.preparreRecip();    MyCoffee.preparreRecip();    system("Pause");    return 0;}

运行结果:

这里写图片描述

四、分析总结

  策略模式和模板方法模式都封装算法,一个用组合,一个用继承。模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以抽象的,有子类负责实现。这样可以确保算法的结构保持不变,同时由子类提供部分实现。

原创粉丝点击