Template模板方法模式
作用:定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

其关键是将通用算法(逻辑)封装在抽象基类中,并将不同的算法细节放到子类中实现。

UML图如下:

AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶层逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到之类实现。顶层逻辑也有可能调用一些具体方法。

ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

特点

模板方法模式是通过把不变行为搬移到基类,去除之类中的重复代码来体现它的优势。

当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

代码如下:

TemplateMethod.h

 #ifndef _TEMPLATEMETHOD_H_
#define _TEMPLATEMETHOD_H_ //抽象模板,并定义了一个模板方法。
class AbstractClass
{
public:
~AbstractClass();
//具体的模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类中实现
void TemplateMethod();
//一些抽象行为,放到子类中去实现
virtual void PrimitiveOperation1()=;
virtual void PrimitiveOperation2()=;
protected:
AbstractClass();
private:
}; //实现基类所定义的抽象方法
class ConcreteClassA : public AbstractClass
{
public:
ConcreteClassA();
~ConcreteClassA();
//实现基类定义的抽象行为
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
private:
}; //实现基类所定义的抽象方法
class ConcreteClassB : public AbstractClass
{
public:
ConcreteClassB();
~ConcreteClassB();
//实现基类定义的抽象行为
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
private:
};
#endif

TemplateMethod.cpp

 #include "TemplateMethod.h"
#include <iostream> using namespace std; AbstractClass::AbstractClass()
{} AbstractClass::~AbstractClass()
{} void AbstractClass::TemplateMethod()
{
this->PrimitiveOperation1();
this->PrimitiveOperation2();
} ConcreteClassA::ConcreteClassA()
{} ConcreteClassA::~ConcreteClassA()
{} void ConcreteClassA::PrimitiveOperation1()
{
cout << "ConcreteClassA::PrimitiveOperation1" << endl;
} void ConcreteClassA::PrimitiveOperation2()
{
cout << "ConcreteClassA::PrimitiveOperation2" << endl;
} ConcreteClassB::ConcreteClassB()
{} ConcreteClassB::~ConcreteClassB()
{} void ConcreteClassB::PrimitiveOperation1()
{
cout << "ConcreteClassB::PrimitiveOperation1" << endl;
} void ConcreteClassB::PrimitiveOperation2()
{
cout << "ConcreteClassB::PrimitiveOperation2" << endl;
}

Main.cpp

 #include "TemplateMethod.h"

 int main()
{
//ConcreteClassA与ConcreteClassB可相互替换
AbstractClass* pAbstract = new ConcreteClassA();
pAbstract->TemplateMethod(); pAbstract = new ConcreteClassB();
pAbstract->TemplateMethod(); return ;
}

C++设计模式-TemplateMethod模板方法模式的更多相关文章

  1. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  2. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  3. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  4. 设计模式之模板方法模式(TemplateMethod)

    模板方法模式使用继承来实现模式的功能,在基类使用一个方法来定义算法的各个步骤,这些步骤(方法)的具体实现会放到子类中,通过这样来实现不同算法对象的算法拼合,完成该对象整体算法的实现. 作用 模板方法中 ...

  5. 【GOF23设计模式】模板方法模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...

  6. [设计模式] 22 模板方法模式 template

    转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...

  7. java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)

    定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...

  8. 【Unity3D与23种设计模式】模板方法模式(Template Method)

    GoF中定义: "在一个操作方法中定义算法的流程,其中某些步骤由子类完成. 模板方法模式让子类在不变更原有算法流程的情况下,还能够重新定义其中的步骤" 每一次武器攻击目标时,都要按 ...

  9. 设计模式之模板方法模式:实现可扩展性设计(Java示例)

    概述 在实际开发中,常常会遇到一项基本功能需要支撑不同业务的情况.比如订单发货,有普通的整包发货,有分销单的发货,采购单的发货,有多商品的整包或拆包发货等.要想支持这些业务的发货,显然不能在一个通用流 ...

随机推荐

  1. SQL server2008-对象资源管理器-数据库

    数据库:系统数据库(master.model.msdb.tempdb).数据库快照.自定义数据库组成 三部分组成. master:Master数据库是SQL Server中最重要的系统数据库,记录了S ...

  2. oracle查询一个时间段每天的数据量

    1.需求: 从所有数据中,查出一个时间段中每天的数据量,即:按日做汇总. 2.SQL语句模板: select trunc(date_col) date, sum(num_col) num, count ...

  3. 《JavaScript DOM编程艺术》读后总结

    这是我读的第一本关于JS的书,刚开始我为了选择合适的学习JS的书,看了网上许多人的意见,基本上都是推荐先读这本书.书的内容挺简单的,确实很适合初学者看,阅读的过程中不会产生什么障碍.内容虽然简单,但我 ...

  4. github:如何获取项目源代码

    github是流行的源码管理平台.这上面有很多开源的项目.作为普通的用户,如何获取这些开源项目的源码呢? 1.首先需要注册一个github账号. 2.安装windows下的git工具:下载地址: ht ...

  5. bash while/until循环学习

    while循环:条件满足,则循环:失败,则退出 如何退出? 必须有时刻,条件测试不成功 ? :条件控制变量 while 条件测试:do 循环体 done until循环:条件不满足,则循环:否则,退出 ...

  6. 在指定的div中搜索内容,并滚动显示到当前搜索到的内容处

    我想要的是页面中有个带滚动条的div对象,里面有很多内容,想要用js搜索到div中的某个字符串内容,然后将div的滚动条滚动到搜索到的内容处显示,自动定位.先是查找页面中的内容,然后将找到的内容创建t ...

  7. android 获取SD卡相关信息

    Object localOb; String str1 = null; try { localOb = new FileReader("/sys/block/mmcblk0/device/t ...

  8. 1.AutoMapper核心:扁平化

    对象 - 对象映射的一个常见用法是获取一个复杂的对象模型,并将其展开成一个更简单的模型. 您可以采取复杂的模型,如: public class Order { private readonly ILi ...

  9. SQL 导出表结构到Excel

    SQL 导出表结构到Excel SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号 = a ...

  10. MSSQL MERGE语法

    Merge的用法 Merge可以完成以下功能: 1.    两个表之间数据的更新 2.    进行进销存更新库存 3.    进行表之间数据的复制 语法说明: 1.    在语句结束后一定要用分号,否 ...