设计模式之模板方法模式

一、模式动机

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

二、模式定义

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

运行结果:

这里写图片描述

四、分析总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值