设计模式C++学习笔记之九(Template Method模板方法模式)
模板模式也是相当简单的一种模式,而且是比较常用的。模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。cbf4life举的例子是悍马车模型,更详细的例子说明可以参考原作者博客:cbf4life.cnblogs.com。这里只提出C++的设计和实现方法,以方便随用随取。
9.1.解释
main(),客户
CHummerModel,悍马模型
CHummerH1Model,悍马模型型号1
CHummerH2Model,悍马模型型号2
说明:在CHummerModel声明Start、Engineboom、Alarm、Stop虚函数,由派生类实现。基类的Run负责组织逻辑,分别调用这几个派生类实现的函数。
注意:基类中的Run应该禁止派生类覆盖。
看代码:
//HummerModel.h
#pragma once
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();
};
//HummerModel.cpp
#include "StdAfx.h"
#include "HummerModel.h"
#include <iostream>
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;
}
//HummerH1Model.h
#pragma once
#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;
};
//HummerH1Model.cpp
#include "StdAfx.h"
#include "HummerH1Model.h"
#include <iostream>
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;
}
//HummerH2Model.h
#pragma once
#include "hummermodel.h"
class CHummerH2Model :
public CHummerModel
{
public:
CHummerH2Model(void);
~CHummerH2Model(void);
void Start();
void Stop();
void Alarm();
void EngineBoom();
bool IsAlarm();
};
//HummerH2Model.cpp
#include "StdAfx.h"
#include "HummerH2Model.h"
#include <iostream>
using std::cout;
using std::endl;
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;
}
//TemplateMethod.cpp
#include "stdafx.h"
#include "HummerModel.h"
#include "HummerH1Model.h"
#include "HummerH2Model.h"
#include <crtdbg.h>
int _tmain(int argc, _TCHAR* argv[])
{
//客户开着H1型号,出去遛弯了
CHummerModel *ph1 = new CHummerH1Model();
ph1->Run();
delete ph1;
//客户开H2型号,出去玩耍了
CHummerModel *ph2 = new CHummerH2Model();
ph2->Run();
delete ph2;
//客户开着H1型号,出去遛弯了,并且不让喇叭响
CHummerH1Model *ph11 = new CHummerH1Model();
ph11->SetAlarm(false);
ph11->Run();
delete ph11;
_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
_CrtDumpMemoryLeaks();
return 0;
}

由基类的Run来实现基本固定的逻辑,而把不同的部分封装在子类里。Run应该不允许子类覆盖。模板方法属于行为型模式。比较简单,也比较常用。
设计模式C++学习笔记之九(Template Method模板方法模式)的更多相关文章
- 设计模式13:Template Method 模板方法模式(行为型模式)
Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...
- 设计模式学习笔记——Template Method模板方法模式
可能是最简单的设计模式. 而且你我都用过而不自知. 因为,模板方法模式也者,就是面向对象中的继承.公用部分放在父类,子类继承父类,然后扩展.呵呵.
- 设计模式 : Template method 模板方法模式 -- 行为型
设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...
- 设计模式(22)--Template Method(模板方法模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声 ...
- Template Method - 模板方法模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的 ...
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- 设计模式C++学习笔记之十一(Bridge桥梁模式)
桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化.实现分离的办法就是增加一个类, 11.1.解释 main(),客户 IProduct,产品接口 CHouse,房子 CIPod,ip ...
- 设计模式C++学习笔记之十(Builder建造者模式)
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数.详细的还是看代码吧. 10.1.解释 ...
随机推荐
- python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)
###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位 线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个 ...
- 【转】Linux C下非特定波特率的配置和使用
https://blog.csdn.net/jinhongdu/article/details/43413071 对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和i ...
- ES学习之分片路由
本文主要内容: 1.路由一个文档到一个分片 2.新建.索引和删除请求 3.取回单个文档 4.局部单个文档 5.多文档模式 6.理解一下ES深度分页(from-size)的劣势 路由一个文档到一个分片 ...
- HDU 1028(数字拆分 分治)
题意是求所给的数能够被拆分成的不同组合数目. 方法有三种: 一.完全背包. 限制条件:所用数字不大于 n. 目标:求分解种数(组合出 n 的方法数). 令 dp[ i ][ j ] = x 表示 用前 ...
- vertica系列:数据的导入导出
本文仅涉及 Vertica 导入导出本地文件, 以及两个 Vertica 集群相互导出, 不涉及 Vertica 和 hdfs/Hive 导入导出和互操作. copy 数据导入工具 copy 命令无疑 ...
- List<string>序列化与反序列化一个小坑
Newtonsoft序列化与反序列化有两个重载方法,带<T>和不带<T>的 如果将一个List<String>序列化为jsonStr后,再反序列化,会变成JArra ...
- electron-vue:Vue.js 开发 Electron 桌面应用
相信很多同学都知道 Electron 可以帮助开发人员使用前端技术开发桌面客户端应用,今天介绍的 electron-vue 框架是一套基于 Vue.js 开发 Electron 桌面应用的脚手架,该项 ...
- 将.csv数据导入到mysql中
1.首先看一下我需要导入的数据: 用excel打开的时候显示: 用notepad++打开显示为: 2.使用notepad++打开改变字符集为UTF-8 3,建立表,表中的字段要和文件中的一致 3.执行 ...
- spring boot2 整合(一)Mybatis (特别完整!)
大概介绍下流程: 借助idea实现mybatis逆向工程 用xml配置实现整合 用cmd命令行实现mybatis逆向工程 用mapping.xml配置实现数据交互 用注解的方式实现数据交互 首先我的开 ...
- 20155324 2016-2017-2 《Java程序设计》第9周学习总结
20155324 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛 ...