设计模式(c++)笔记之十三(Template模式)
2013-10-23 19:25
381 查看
一、描述:
在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。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
相关文章推荐
- 设计模式C++描述----02.模板(Template)模式
- 设计模式C++学习笔记之十六(Observer观察者模式)
- 设计模式C++学习笔记之四(Multition多例模式)
- 设计模式C++学习笔记之三(Singleton单例模式)
- 设计模式(c++)笔记之二十一(Chain of Responsibility模式)
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- 设计模式C++学习笔记之四(Multition多例模式)
- 设计模式(c++)笔记之十六(Observer模式)
- 设计模式C++学习笔记之八(Adapter适配器模式)
- JAVA学习笔记(十三)-模板方法模式Template
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式C++学习笔记之六(Facade门面模式)
- 设计模式C++学习笔记之四(Command命令模式)
- 设计模式C++学习笔记之六(Facade门面模式)
- 设计模式C++ 笔记二 结构型模式
- 设计模式(c++)笔记之八(Decorator模式)
- 设计模式C++ 笔记一 创建型模式(Factory、abstract factory、singleton)
- 设计模式C++学习笔记之八(Adapter适配器模式)
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式C++描述----02.模板(Template)模式