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. JDBC向数据库中插入数据

    新建数据库,并插入相关数据. create database bbs; use bbs; create table article ( id int primary key auto_incremen ...

  2. socket reuse

    int k   =   1;    if( SUCCESS != m_socketServer.setSockOptSocket( SO_REUSEADDR, (char*)&k, sizeo ...

  3. Mongodb优化

    本文将从各个层面讲述Mongodb的优化方法

  4. Tomcat报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]

    Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] 解决办法: 1,检测你的web.xml.去掉所 ...

  5. HTML 表格

    HTML 表格:表格由<table>标签来定义,行数由<tr>标签来定义,单元格由<td>标签来定义:<table border="1"& ...

  6. DataTable 批量插入SqlServer数据库 使用:SqlBulkCopy

    简单使用: private void UpdateTitle(DataTable dt) { ) { using (SqlBulkCopy sbc = new SqlBulkCopy(SqlHelpe ...

  7. Python-Mac 安装 PyQt4

    环境: 系统: OS X 10.11.4 Python: 2.7.10 1.安装 Qt brew install qt 测试安装结果,需要正确找到 qmake 的路径 qmake 2.安装 SIP 下 ...

  8. Entity Framework 摘记

    1.设置隔离级别 var transactionOptions = new System.Transactions.TransactionOptions(); transactionOptions.I ...

  9. 002. Centos7安装mysql5.5.37

    下载cmake-2.8.12.2.tar.gz, 下载地址: https://pan.baidu.com/s/1qYtpX7m 下载mysql-5.5.37.tar.gz, 下载地址: http:// ...

  10. C++中vector的remove用法

      我将从remove的复习开始这个条款,因为remove是STL中最糊涂的算法.误解remove很容易,驱散所有关于remove行为的疑虑——为什么它这么做,它是怎么做的——是很重要的. 这是rem ...