C++实现模板方法模式的示例代码

外观模式

目录

模式定义

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

模式动机

  • 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
  • 既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复嗲吗都应该要上升到父类去,而不是让每个子类都去重复。

UML类图

源码实现 abstractclass.h

class AbstractClass
{
public:
 AbstractClass();
 virtual ~AbstractClass();

 void MethodA();
 virtual int MethodB(int a = 0, int b = 0);
};

abstractclass.cpp

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

AbstractClass::AbstractClass()
{

}

AbstractClass::~AbstractClass()
{

}

void AbstractClass::MethodA()
{
 std::cout << __FUNCTION__ << " Call method b :" << this->MethodB(5, 4) << std::endl;
}

int AbstractClass::MethodB(int a, int b)
{
 return a + b;
}

concreteclassa.h

#include "abstractclass.h"

class ConcreteClassA : public AbstractClass
{
public:
 ConcreteClassA();
 int MethodB(int a = 0, int b = 0) override;
};

concreteclassa.cpp

#include "concreteclassa.h"

ConcreteClassA::ConcreteClassA()
{

}

int ConcreteClassA::MethodB(int a, int b)
{
 return a * b;
}

concreteclassb.h

#include "concreteclassb.h"

ConcreteClassB::ConcreteClassB()
{

}

int ConcreteClassB::MethodB(int a, int b)
{
 return a - b;
}

concreteclassb.cpp

#include "concreteclassb.h"

ConcreteClassB::ConcreteClassB()
{

}

int ConcreteClassB::MethodB(int a, int b)
{
 return a - b;
}

main.cpp

#include <iostream>
#include "concreteclassa.h"
#include "concreteclassb.h"

using namespace std;

int main()
{
 ConcreteClassA* classA = new ConcreteClassA();
 classA->MethodA();

 ConcreteClassB* classB = new ConcreteClassB();
 classB->MethodA();
 return 0;
}

运行结果

MethodA Call method b :20
MethodA Call method b :1

优点

模板方法模式的优点

  • 通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。
  • 提供了一个很好的代码复用的平台。
  • 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类拜托重复的不变行为的纠缠。

缺点

模式的缺点

到此这篇关于++实现模板方法模式的示例代码的文章就介绍到这了,更多相关c++ 模板方法模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++设计模式编程中Template Method模板方法模式的运用

    准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模版方法模式的用意. 很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这个模式.模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心. 模版方法模式需要开发抽象类和具体子类的设计师之间的协作

  • 详解设计模式中的模板方法模式及在C++中的使用

    模板方法模式是设计模式行为型中最简单的一种设计模式.在实际中你甚至可能经常用到,只是你自己不知道它是一种设计模式罢了. 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 角色: 抽象类(AbstractClass): 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法,实现一个模板方法,定义一个算法的骨架.该模板方法不仅调用原语操作,也调用定义 具体子类 (ConcreteClass): 实现原语操作

  • C++设计模式之模板方法模式

    前言 离开了自己工作了将近两年的公司,日子不再有了忙碌,可以闲下来,躺在家里的床上,想着以后的路怎么走,说实话,真的很迷茫,从2012年毕业到现在,时间不长,但是学到的东西真的是非常有限,一直从事于Windows平台上的开发.说到Windows平台的开发,大家都肯定知道的HOOK的,即使不知道HOOK,对于COM应该也是知道的,我的系列博文中也对COM进行过全面的总结.说白了,HOOK就是在执行某个功能时,会有一个一系列的执行过程,对于这个过程一般都是固定的,比如:第一步执行什么,第二步干什么,

  • C++设计模式之模板方法模式(TemplateMethod)

    模板方法模式使用继承来实现模式的功能,在基类使用一个方法来定义算法的各个步骤,这些步骤(方法)的具体实现会放到子类中,通过这样来实现不同算法对象的算法拼合,完成该对象整体算法的实现. 作用 模板方法中定义了具体操作中所使用算法的各个步骤,并将其实现交由子类完成,从而实现多种不同的功能: 类视图 实现 class Lunch { public: Lunch(){} virtual ~Lunch(){} void feed() { cooking(); eating(); cleaning(); }

  • C++实现模板方法模式的示例代码

    外观模式 目录 模式定义 模板方法模式(Facade),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式动机 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理. 既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复嗲吗都应该要上升到父类去,而不是让每个子类都去重复. UML类图 源码实现 abstractclas

  • Python3实现建造者模式的示例代码

    建造者模式 建造者模式用于创建复杂的对象.使用建造者模式可以使复杂的过程层次明了.清晰,把对象的创建以及使用进行了解耦.实际上从代码的角度上看,是进行了多次封装,使代码结构更为规范合理,层次结构更加鲜明. 在一个复杂的对象中,需要编写大量的代码去实现这一个类,并且在进行初始化时,也有可能会有大量的参数去进行初始化. 建造者模式把实现一个类给拆分成多个创建步骤,这些步骤在大多数相关资料中,一般以拟人化的形式进行表达:例如建造者.指挥者以及导演者,但是这些名词的拟人化并不能完全的让读者能够get到完

  • 学习php设计模式 php实现模板方法模式

    一.意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method 使得子类可以在不改变一个算法的结构的情况下重定义该算法的某些特定的步骤[GOF95] 二.模板方法模式结构图 三.模板方法模式中主要角色 抽象模板(AbstractClass)角色: 定义一个或多个抽象方法让子类实现.这些抽象方法叫做基本操作,它们是顶级逻辑的组成部分. 定义一个模板方法.这个模板方法一般是一个具体方法,它给出顶级逻辑的骨架,而逻辑的组成步骤在对应的抽象操作中,这些操作将会推迟到子类中

  • Java设计模式之java模板方法模式详解

    目录 模板方法模式 介绍 角色 代码演示 模板方法模式总结 优点 缺点 适用场景 源码分析模板方法模式的典型应用 Servlet 中的模板方法模式 Hello World! Spring中的IOC容器启动-refresh()方法 参考文章 总结 模板方法模式 在程序开发中,经常会遇到这种情况:某个方法要实现的算法需要多个步骤,但其中有一些步骤是固定不变的,而另一些步骤则是不固定的.为了提高代码的可扩展性和可维护性,模板方法模式在这种场景下就派上了用场. 譬如制作一节网课的步骤可以简化为4个步骤:

  • iOS App使用设计模式中的模板方法模式开发的示例

    模板方法模式的核心思想就是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势.其实,模板方法模式就是提供了一个很好的代码复用平台. 首先,还是先简单看一下定义: 模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 下面和给大家展示一下类的结构图: 其实,结构很简单,只有两层关系,核心思想就是把公共方法向上提到父类中.代码实现起来也不复杂.下面还是老样子,向大家简单展示一下代码如何实现. 首先是一

  • JavaScript设计模式之模板方法模式原理与用法示例

    本文实例讲述了JavaScript设计模式之模板方法模式原理与用法.分享给大家供大家参考,具体如下: 一.模板方法模式:一种只需使用继承就可以实现的非常简单的模式. 二.模板方法模式由两部分组成,第一部分是抽象父类,第二部分是具体的实现子类. 三.以设计模式中的Coffee or Tea来说明模板方法模式: 1.模板Brverage,代码如下: var Beverage = function(){}; Beverage.prototype.boilWater = function(){ cons

  • vue 基于abstract 路由模式 实现页面内嵌的示例代码

    abstract 路由模式 abstract 是vue路由中的第三种模式,本身是用来在不支持浏览器API的环境中,充当fallback,而不论是hash还是history模式都会对浏览器上的url产生作用,本文要实现的功能就是在已存在的路由页面中内嵌其他的路由页面,而保持在浏览器当中依旧显示当前页面的路由path,这就利用到了abstract这种与浏览器分离的路由模式. 路由示例 export const routes = [ { path: "/", redirect: "

  • C语言责任链模式示例代码

    目录 介绍: 作用: 类比: 示例: 总结 介绍: ​ 责任链模式是一种行为模式,它可以允许你将请求沿着处理者链进行发送,收到请求以后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者: 作用: 将请求按照链的方式一一传递 类比: ​ 公司申请报销,首先要leader审批通过,然后是HR,再然后是财务,最后是老板,一级一级的将请求传递: 示例: #include <stdio.h> #include <assert.h> #include "list.h&q

  • Java经典设计模式之模板方法模式定义与用法示例

    本文实例讲述了Java设计模式之模板方法模式.分享给大家供大家参考,具体如下: 我们在生活中,很多事情都包含特定的一些步骤.如去银行办理业务,通常步骤的次序是:取号 –> 填单 –> 等待叫号–>办理业务.这几个步骤中,有的是不变的,比如取号,每个人都要取,但有的是要变的,比如都有填单,但是根据不同的业务,填写的单据不同.又比如我们外出吃饭,一般的步骤是:点餐–>等待–>吃饭–>付钱,也能发现同样的规律.这样的事情数不胜数. 项目开发中,也可能遇到这样的情况,多个功能模

随机推荐