首页 > 编程语言 >C++设计模式:TemplateMethod模式(一)

C++设计模式:TemplateMethod模式(一)

时间:2024-04-06 23:59:34浏览次数:26  
标签:virtual void Library Application TemplateMethod C++ step4 设计模式 step2

1、概念定义
  • 定义一个操作中的算法的骨架结构(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的骨架结构即可重定义(override重写)该算法的某些特定步骤

  • 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但是各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现

  • 如何在确定稳定操作结构的前提下,来罗应对各种各个子步骤的变化或者晚期实现需求?

2、Demo举例
  • 例如现在存在两个开发人员,一个开发人员负责编写Library库(底层开发),另外一个开发人员编写Application(高层开发)。

  • 最后将Library和Application组合完成一个算法的结构骨架

2.1、结构化软件设计流程
  • Library中提供step1、step3、step5三个方法
  • Application中提供step2、step4两个方法
  • run()一个算法骨架结构,也需要Application人员编写
  • 看起来这个代码很好是一段低耦合的代码,实际上这里存在问题的。
    • step1、step3、step5方法完全暴露给了高层开发人员,其他高层开发者也能调用到
    • run算法骨架结构实际来说是一个稳定的东西,就这种执行流程,变化主要是在step2、step4中
    • 这是一种结构化软件设计流程,是一种早绑定的例子
class Library{
public:
    void step1(){   }

    void step3(){   }

    void step5(){   }
    virtual ~Library(){     }
};


class Application{
public:
    bool step2(){   }
    void step4(){   }
    virtual ~Application(){     }
};

void run()
{
    Library lib;
    Application app;
    lib.step1();
    if(app.step2()){
        lib.step3();
    }
    for(int i = 0;i < 4;i++){
        app.step4();
    }
    lib.step5();
}

在这里插入图片描述

2.2、面向对象软件设计流程
  • 首先需要清楚一点:run方法是稳定的(稳定这个词是相对的),这个算法骨架结构的变化没有step2、step4的变化结构快
  • 通过纯虚函数表明Library是一个抽象类,而如果想使用这个抽象类只需要继承然后实现抽象方法即可
    • protected将方法隐藏不对外public暴露给无关调用者,只允许子类调用
    • 只对外暴露算法骨架结构的调用入口,至于整个执行流程是怎么样的无须Application应用层(高层开发者)关心
    • 子类只需要继承实现step2、step4方法,使用时只需要使用多态的动态绑定(晚绑定)来实现
    • 这里主要使用了多态的机制,将高层开发者对Library的使用机制释放出来
  • 这种晚绑定主要是通过多态的动态绑定来实现,动态绑定的本质也是一个回调函数的指针
class Library{
public:
    // 稳定template method
    void run(){
        step1();
        if(step2()){            // 支持变化    -->   虚函数的多态调用
            step3();
        }
        for(int i = 0;i < 4;i++){
            step4();            // 支持变化    -->   虚函数的多态调用
        }
        step5();
    }
    virtual ~Library(){

    }
protected:
    void step1(){               // 稳定		}

    void step3(){               // 稳定		}

    void step5(){               // 稳定		  }
    virtual bool step2() = 0;   // 变化
    virtual void step4() = 0;   // 变化
};


class Application: public Library{
protected:
    virtual bool step2() override {
        // 子类重写实现
    }

    virtual void step4() override {
        // 子类重写实现
    }
};

int main()
{
    Library *library = new Application();
    library->run();
    return 0;
}

在这里插入图片描述

3、总结
  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它应用最简洁的机制(虚函数的多态性)为很多引用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构
  • 除了可以灵活对应子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用
  • 在具体实现方面,被Template Method调用的虚函数方法可以有实现也可以没有任何实现(纯虚函数),但是一般将它们设置为protected方法

标签:virtual,void,Library,Application,TemplateMethod,C++,step4,设计模式,step2
From: https://blog.csdn.net/weixin_43808717/article/details/137347087

相关文章

  • 向上和向下取整(数学和C++实现)
    例如:1.向下取整⌊⌋⌊100/150⌋=0,⌊-100/150⌋=-1(100/150=2/3,并且0<2/3<1,所以向下取整后为0。-100/150=-2/3,并且-1<-2/3<0,所以向下取整之后为-1)2.向上取整⌈⌉⌈100/150⌉=1,⌈-100/150⌉=0(100/150=2/3,并且0<2/3<1,所以向上取整后为1。-100/150=-2/3,并且-1<-2/3<0,所以......
  • C++基础——字符串(C语言和C++的字符串风格区别)
    C语言风格的字符串字符串通常是以字符数组或字符指针的形式表示的。字符串以空字符('\0')结尾!!!两种形式:(1)字符指针形式的字符串charstr[]="HelloC++";(2)字符数组形式的字符串char*ptr="HelloC++";C风格字符串的运算运算需要使用string函数,需要加入头文件<stri......
  • Android Graphics 多屏同显/异显 - C++示例程序(标准版)
    ”为了理解Android多屏同显/异显的基本原理,我们将从NativeLevel入手,基于GraphicsAPIs写作一个简单的C++版本的多屏显示互动的演示程序。通过这个程序我们将了解常用的多屏显示相关的接口的使用方法。“  01多屏显示C++示例概况 源码下载请查看文章末尾源码下载方......
  • C++基础知识整理
    1.CPP编译链接过程2.new和malloc区别,delete和free区别3.指针和引用4.左值引用和右值引用5.const6.函数重载7.函数调用栈帧开辟过程8.inline内联函数9.static关键字10.定义指向类的成员的指针11.this指针12.常成员方法13.函数模板与类模板函数模板类......
  • C++从入门到精通——初步认识面向对象及类的引入
    初步认识面向对象及类的引入前言一、面向过程和面向对象初步认识C语言C++二、类的引入C++的类名代表什么示例C++与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小总结前言面向过程注重任务的流程和控制,适合简单任务和流程固定的......
  • c++算法学习笔记 (20) 哈希表
    1.模拟散列表//拉链法#include<bits/stdc++.h>usingnamespacestd;constintN=100003;inth[N];inte[N],ne[N],idx;//存链voidinsert(intx){intk=(x%N+N)%N;//让负数的余数变成正数(若直接加N,则可能溢出)e[idx]=x;ne[idx]......
  • c++算法学习笔记 (21) STL
    1.vector:        变长数组,倍增的思想        size()返回元素个数        empty()返回是否为空        clear()清空        front()/back()元素        push_back()/pop_back()        begin()/end()迭代器 ......
  • c++算法学习笔记 (19) 堆
    1.堆排序:(1)插入一个数:heap[++size]=x;up(size);//在最后插入,再往上移(2)求集合中最小值:heap[1](3)删除最小值:swap(heap[1],heap[size]);size--;down(1);//将最小值移到最后直接删除,再将heap[1]下移到合适位置(4)删除任意一个元素:swap(heap[k],heap[size]);size--;down(1)orup(1);/......
  • 毅四捕Go设计模式笔记——桥接模式
    桥接模式(BridgePattern)桥接模式是一种结构型设计模式,它的主要目的是将抽象部分与它的实现部分解耦,使它们都可以独立的变化。通过使用组合而非继承的方式,桥接模式结合了两个独立的维度,让它们可以独立扩展而不是在两者之间建立静态的继承关系。为了解决什么问题?桥接模式解......
  • C/C++预处理过程
    目录前言:1.预定义符号2. #define定义常量3. #define定义宏4.带有副作用的宏参数5.  宏替换的规则6. 宏和函数的对比7.#和##8. 命名约定9. #undef10. 命令行定义11. 条件编译12. 头文件的包含13. 其他预处理指令总结:。前言:本篇介绍c/c+......