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

 更新时间:2020年07月14日 15:13:25   作者:鬼谷子com  
这篇文章主要介绍了++实现模板方法模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

模式定义

模板方法模式(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++ 模板方法模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 中strcpy标准写法实例详解

    C++ 中strcpy标准写法实例详解

    这篇文章主要介绍了C++ 中strcpy标准写法实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++实现LeetCode(75.颜色排序)

    C++实现LeetCode(75.颜色排序)

    这篇文章主要介绍了C++实现LeetCode(75.颜色排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C/C++实现的游戏角色名称名字随机生成代码

    C/C++实现的游戏角色名称名字随机生成代码

    这篇文章主要介绍了C/C++实现的游戏角色名称名字随机生成代码,本文特别针对一些古典游戏的角色名称进行随机生成,需要的朋友可以参考下
    2015-05-05
  • 深入理解Java事务的原理与应用

    深入理解Java事务的原理与应用

    下面小编就为大家带来一篇深入理解Java事务的原理与应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • GetChar缓存机制深入剖析

    GetChar缓存机制深入剖析

    以下是对GetChar缓存机制进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • 深入学习C++智能指针之shared_ptr与右值引用的方法

    深入学习C++智能指针之shared_ptr与右值引用的方法

    智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存,今天通过本文给大家分享C++智能指针之shared_ptr与右值引用的方法,需要的朋友跟随小编一起看看吧
    2021-07-07
  • C++ OpenCV裁剪图片时发生报错的解决方式

    C++ OpenCV裁剪图片时发生报错的解决方式

    在图像处理中,我们经常根据需要截取图像中某一区域做处理,下面这篇文章主要给大家介绍了关于C++ OpenCV裁剪图片时发生报错的解决方式,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • snprintf函数的用法解析

    snprintf函数的用法解析

    以下是对snprintf函数的具体使用方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • 一文读懂c++之static关键字

    一文读懂c++之static关键字

    这篇文章主要介绍了c++之static关键字的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C语言实现在控制台打印余弦曲线

    C语言实现在控制台打印余弦曲线

    余弦曲线又叫余弦波(cosinwave),是一种来自数学三角函数中的余弦比例的曲线。这篇文章主要为大家介绍了如何在控制台绘制余弦曲线,感兴趣的可以了解一下
    2023-02-02

最新评论