设计模式(c++)笔记之十三(Template模式)

一、描述:


      在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template 提供了这种情况的一个实现框架。
Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。【注释1】

      【注释1】:Strategy模式解决的是和Template模式类似的问题,但是Strategy模式是将逻辑(算法)封装到一个类中,并采取组合(委托)的方式解决这个问题。 

      解决 2.1 中问题可以采取两种模式来解决,一是 Template 模式,二是 Strategy 模式。本文当给出的是 Template 模式。

一个通用的 Template 模式的结构图为: 




Template 模式实际上就是利用面向对象中多态的概念实现算法实现细节和高层接口的松耦合。


二、实例


      周三,9:00,我刚刚坐到位置,打开电脑准备开始干活。“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑。还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要...(中间省略 20 分钟的讲话,如果你听过领导人的讲话,这个你应该能够续上)”动员工作做完了,那就开始压任务了,“这次时间是非常紧张的,只有一个星期的时间,小三,你负责在一个星期的时间把这批 10 万车模(注:车模是车辆模型的意思,不是香车美女那个车模)建设完成...”

      “一个星期?这个...,是真做不完,要做分析,做模板,做测试,还要考虑扩展性、稳定性、健壮性等,时间实在是太少了”还没等老大说完,我就急了,再不急我的小命就折在上面了!

      “那这样,你只做实现,不考虑使用设计模式,扩展性等都不用考虑”老大又把我压回去了。“不考虑设计模式?那...”哎,领导已经布置任务了,那就开始死命的做吧,命苦不能怨政府,点背不能怪社会呀,然后就开始准备动手做,在做之前先介绍一下我们公司的背景,我们公司是做模型生产的,做过桥梁模型、建筑模型、机械模型,甚至是一些政府、军事的机密模型,这个不能说,就是把真实的实物按照一定的比例缩小或放大,用于试验、分析、量化或者是销售等等,上面提到的牛叉模型公司专门销售车辆模型的公司,自己不生产,我们公司是第一次从牛叉模型公司接单,那我怎么着也要把活干好,可时间很紧张呀,怎么办?


      既然领导都说了,不考虑扩展性,那好办,我先设计个类图:





非常简单的实现,你要悍马模型,我就给你悍马模型,先写个抽象类,然后两个不同型号的模型实现类, 这样就搞定了!



注释:

main(),客户

CHummerModel,悍马模型

CHummerH1Model,悍马模型型号1

CHummerH2Model,悍马模型型号2

说明:在CHummerModel声明Start、Engineboom、Alarm、Stop虚函数,由派生类实现。基类的Run负责组织逻辑,分别调用这几个派生类实现的函数。

注意:基类中的Run应该禁止派生类覆盖。


代码:

悍马模型:HummerModel类

HummerModel.h

#ifndef __Template_Method__HummerModel__
#define __Template_Method__HummerModel__

#include <iostream>
class CHummerModel
{
public:
    CHummerModel(void);
    virtual ~CHummerModel(void);
    void Run();
    
protected:
    virtual void Start() = 0;
    virtual void Stop() = 0;
    virtual void Alarm() = 0;
    virtual void EngineBoom() = 0;
    virtual bool IsAlarm();
};

#endif /* defined(__Template_Method__HummerModel__) */
HummerModel.cpp

#include "HummerModel.h"
using std::cout;
using std::endl;
CHummerModel::CHummerModel(void)
{
    
}

CHummerModel::~CHummerModel(void)
{
    
}

void CHummerModel::Run()
{
    //先发动汽车
    Start();
    //引擎开始轰鸣
    EngineBoom();
    //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭
    if (IsAlarm())
        Alarm();
    
    //到达目的地就停车
    Stop();
}

bool CHummerModel::IsAlarm()
{
    //钩子方法,默认喇叭是会响的
    return true;
}

悍马模型型号1:HummerH1Model类

HummerH1Model.h

#ifndef __Template_Method__HummerH1Model__
#define __Template_Method__HummerH1Model__

#include <iostream>
#include "HummerModel.h"

class CHummerH1Model:public CHummerModel
{
public:
    CHummerH1Model(void);
    ~CHummerH1Model(void);
    void SetAlarm(bool tag);
    void Start();
    void Stop();
    void Alarm();
    void EngineBoom();
    bool IsAlarm();
private:
    bool m_isAlarm;
};

#endif /* defined(__Template_Method__HummerH1Model__) */
HummerH1Model.cpp

#include "HummerH1Model.h"
using std::cout;
using std::endl;

CHummerH1Model::CHummerH1Model(void)
{
    m_isAlarm = true;
}

CHummerH1Model::~CHummerH1Model(void)
{
    
}

void CHummerH1Model::Start()
{
    cout << "悍马H1发动..." << endl;
}
void CHummerH1Model::Stop()
{
    cout << "悍马H1停车..." << endl;
}
void CHummerH1Model::Alarm()
{
    cout << "悍马H1鸣笛" << endl;
}
void CHummerH1Model::EngineBoom()
{
    cout << "悍马H1引擎声音是这样...." << endl;
}

bool CHummerH1Model::IsAlarm()
{
    return this->m_isAlarm;
}

void CHummerH1Model::SetAlarm(bool tag)
{
    this->m_isAlarm = tag;
}

悍马模型型号2:HummerH2Model

HummerH2Model.h

#ifndef __Template_Method__HummerH2Model__
#define __Template_Method__HummerH2Model__

#include <iostream>
#include "HummerModel.h"
using std::cout;
using std::endl;

class CHummerH2Model:public CHummerModel
{
public:
    CHummerH2Model(void);
    ~CHummerH2Model(void);
    void Start();
    void Stop();
    void Alarm();
    void EngineBoom();
    bool IsAlarm();
};


#endif /* defined(__Template_Method__HummerH2Model__) */
HummerH2Model.cpp

#include "HummerH2Model.h"

CHummerH2Model::CHummerH2Model(void)
{
}
CHummerH2Model::~CHummerH2Model(void)
{
}
void CHummerH2Model::Start()
{
    cout << "悍马H2发动..." << endl;
}
void CHummerH2Model::Stop()
{
    cout << "悍马H2停车..." << endl;
}
void CHummerH2Model::Alarm()
{
    cout << "悍马H2鸣笛" << endl;
}
void CHummerH2Model::EngineBoom()
{
    cout << "悍马H2引擎声音是这样...." << endl;
}
bool CHummerH2Model::IsAlarm()
{
    return false;
}

客户:main

main.cpp

#include <iostream>
#include "HummerModel.h"
#include "HummerH1Model.h"
#include "HummerH2Model.h"
using std::cout;
using std::endl;

int main(int argc, const char * argv[])
{
    //客户开着H1型号,出去遛弯了
    cout<<"******客户开着H1型号,出去遛弯了******" <<endl;
    CHummerModel *ph1 = new CHummerH1Model();
    ph1->Run();
    delete ph1;
    
    //客户开H2型号,出去玩耍了
    cout<<"******客户开H2型号,出去玩耍了******" <<endl;
    CHummerModel *ph2 = new CHummerH2Model();
    ph2->Run();
    delete ph2;
    
    //客户开着H1型号,出去遛弯了,并且不让喇叭响
    cout<<"******客户开着H1型号,出去遛弯了,并且不让喇叭响******" <<endl;
    CHummerH1Model *ph11 = new CHummerH1Model();
    ph11->SetAlarm(false);
    ph11->Run();
    delete ph11;
    
    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}

结果如下:




参考文献:《设计模式之禅》,《GoF_23种设计模式解析》

参考博客:  http://www.cnblogs.com/wanggary/archive/2011/04/15/2016619.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值