[C++][设计模式][模板方法]详细讲解

目录

  • 1.动机
  • 2.理解
    • 1.设计流程对比
      • 1.结构化软件设计流程
      • 2.面向对象软件设计流程
    • 2.早绑定与晚绑定
  • 3.模式定义
  • 4.要点总结
  • 5.代码感受
    • 1.代码一 -- 结构化
      • 1.lib.cpp
      • 2.app.cpp
    • 2.代码二 -- 面向对象
      • 1.lib.cpp
      • 2.app.cpp


1.动机

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

2.理解

1.设计流程对比

1.结构化软件设计流程

请添加图片描述


2.面向对象软件设计流程

请添加图片描述


2.早绑定与晚绑定

请添加图片描述


3.模式定义

  • 定义:定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中
  • 功能:Template Method使得子类可以不改变(复用)一个算法的结构,即可重定义(override 重写)该算法的某些特定步骤
  • 结构
    请添加图片描述

4.要点总结

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

5.代码感受

1.代码一 – 结构化

1.lib.cpp

//程序库开发人员
class Library
{
public:
	void Step1()
	{
		//...
	}

    void Step3()
	{
		//...
    }

    void Step5()
	{
		//...
    }
};

2.app.cpp

//应用程序开发人员
class Application
{
public:
	bool Step2()
	{
		//...
    }

    void Step4()
	{
		//...
    }
};

int main()
{
	Library lib();
	Application app();

	lib.Step1();

	if (app.Step2())
	{
		lib.Step3();
	}

	for (int i = 0; i < 4; i++)
	{
		app.Step4();
	}

	lib.Step5();
}

2.代码二 – 面向对象

1.lib.cpp

//程序库开发人员
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; //变化
};

2.app.cpp

//应用程序开发人员
class Application : public Library 
{
protected:
	virtual bool Step2()
	{
		//... 子类重写实现
    }

    virtual void Step4() 
	{
		//... 子类重写实现
    }
};

int main()
{
	Library* pLib = new Application();
	pLib->Run();

	delete pLib;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/735577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“实习情报官”上万月薪!量化私募发力学界

选拔要求有“门道” 量化私募的招聘又有新花样&#xff01; 顶尖高校的数理人才一直是量化机构紧盯的“资源”&#xff0c;包括各类奥赛奖牌得主、理科状元。 最头部的量化机构&#xff0c;也一直是高校学霸们流向的去处。 但是&#xff0c;当业内已有近30家百亿量化私募机…

LLVM——安装多版本LLVM和Clang并切换使用(Ubuntu)

1、描述 本机&#xff08;Ubuntu22&#xff09;已经安装了LLVM-14&#xff0c;但是需要使用LLVM-12。安装LLVM-12和Clang-12并切换使用。 2、过程 安装LLVM-12和Clang-12。 sudo apt-get install llvm-12 sudo apt-get install clang-12 【注】运行 sudo apt-get install ll…

Inpaint软件最新版下载【安装详细图文教程】

​根据使用者情况表明在今天的数字时代&#xff0c;我们经常会遇到需要处理图形的情况&#xff0c;然而&#xff0c;当我们遇到水印在图形上&#xff0c;我们就需要寻找一个有效的方式来去除它&#xff0c;Inpaint软件就是一个非常实用的工具&#xff0c;它能够帮助我们去除水印…

6月21日训练 (东北林业大学)(个人题解)(待补全)

前言&#xff1a; 这次训练是大一大二一起参加的训练&#xff0c;总体来说难度是有的&#xff0c;我和队友在比赛时间内就写出了四道题&#xff0c;之后陆陆续续又补了了三道题&#xff0c;还有一道题看了学长题解后感觉有点超出我的能力范围了&#xff0c;就留给以后的自己吧。…

带百分比的进度条控件(ProgressBar)源码

带百分比的进度条控件&#xff08;ProgressBar&#xff09;&#xff1a; 源码下载地址&#xff1a;https://download.csdn.net/download/wgxds/89472915

淘酒屋荣获2024中法贸易杰出服务商称号暨夏季窖主大会圆满召开

淘酒屋荣获中法贸易杰出服务商称号&#xff0c;暨闪光的创始人2024夏季窖主大会圆满召开 2024年&#xff0c;作为中法建交60周年的重要节点&#xff0c;同时迎来了中法文化旅游年&#xff0c;这为两国文化交流与合作开启了新的篇章。在庆祝中法贸易交流的重要时刻&#xff0c;…

[SAP ABAP] 追加内表数据

向内表中逐条追加数据记录 语法格式 APPEND <wa> TO <itab>. <wa>&#xff1a;代表工作区 <itab>&#xff1a;代表内表 示例1 结果显示&#xff1a; 将一个内表中的所有数据记录添加到另一个内表中 语法格式 APPEND LINES OF <itab1> TO <…

Android焦点机制结合WMS

文章前提&#xff1a; 了解WMS基本作用了解window的概念&#xff0c;phoneWindow&#xff0c;rootViewImpl了解view的事件分发 开始&#xff1a; 讲三件事情&#xff1a; window的创建&#xff0c;更新焦点的更新事件的分发 Window的创建&#xff0c;更新&#xff1a; wi…

赵丽颖纯白茉莉绽放温柔之美

赵丽颖纯白茉莉&#xff0c;绽放温柔之美在这个繁忙喧嚣的娱乐圈&#xff0c;赵丽颖以其独特的魅力&#xff0c;成为了无数人心中的白月光。近日&#xff0c;赵丽颖工作室发布了一组live图&#xff0c;她身着一袭温柔白裙&#xff0c;宛如一朵盛开的纯白茉莉花&#xff0c;美得…

论文阅读03(基于人类偏好微调语言模型)

1.主题 基于人类偏好微调语言模型&#xff08;Fine-Tuning Language Models from Human Preferences&#xff09; 出处&#xff1a; Fine-Tuning Language Models from Human Preferences、 2.摘要 奖励学习使得强化学习&#xff08;RL&#xff09;可以应用于那些通过人类判断…

深度学习windows环境配置

1 下载CUDA和cudnn 详见文章 CUDA与CUDNN在Windows下的安装与配置&#xff08;超级详细版&#xff09;_windows cudnn安装-CSDN博客 我电脑的CUDA下载链接如下 ​​​​​https://developer.nvidia.com/cuda-12-1-0-download-archive?target_osWindows&target_archx86…

Validation校验

文章目录 Validation校验作用依赖坐标UserController接收客户端注册用户请求的方法请求参数封装实体User的结构校验分组 Validation校验 作用 服务端接收前端传递的请求从参数的时候&#xff0c;可以对请求参数进行自动校验。 场景&#xff1a;通过postman向服务端发送一个注…

指纹浏览器与虚拟机的区别及在跨境电商中的应用

在如今数字化世界中&#xff0c;隐私和安全变得愈发重要。许多人在网络上进行敏感操作&#xff0c;如网上购物、在线银行、社交媒体管理等。为了保护自己的隐私&#xff0c;人们常常会寻求一些额外的工具&#xff0c;比如指纹浏览器和虚拟机。这两种工具在保护个人隐私方面都有…

东郊到家类型小程序APP软件基于SpringBoot开发的系统源码

项目背景 在快节奏的现代生活中&#xff0c;人们越来越追求高效、便捷的生活方式。上门服务作为一种新型的服务模式&#xff0c;正逐渐受到广大用户的青睐。而这一切的背后&#xff0c;离不开技术的强大支撑。今天&#xff0c;我们就来探讨一下上门服务类型软件的技术魅力&…

4. DSL入门_01

1. 常见的DSL (1) 查询所有: 查询出所有数据&#xff0c;一般测试的时候使用&#xff0c;例如&#xff1a; match_all .但是受分页限制&#xff0c;一般返回10条数据 (2) 全文检索(full text)查询&#xff1a;利用分词器对用户输入内容分词&#xff0c;然后去倒排索引中匹配&a…

数据结构和算法(2)---- Stack 的原理和实现

Stack 的定义和结构 栈(Stack)是仅限于在表尾进行插入和删除的线性表 我们把允许插入和删除的一端称为栈顶(top)&#xff0c;另一端称为栈底(bottom)&#xff0c;不含任何元素的栈称为空栈&#xff0c;栈也被称为先进后出(Last In First Out)的线性表&#xff0c;简称LIFO结构…

为什么能通过文本分析情感?

通过文本分析情感&#xff0c;通常称为情感分析&#xff08;Sentiment Analysis&#xff09;或意见挖掘&#xff08;Opinion Mining&#xff09;&#xff0c;是自然语言处理&#xff08;NLP&#xff09;的一个分支。这项技术能够识别和提取文本中的主观信息&#xff08;对呀&am…

Linux操作系统处理器调度基本准则和实现

1&#xff0c;基本概念 在多道程序系统中&#xff0c;进程的数量往往多于处理机的个数&#xff0c;进程争用处理机的情况就在所难免。处理机调度是对处理机进行分配&#xff0c;就是从就绪队列中&#xff0c;按照一定的算法&#xff08;公平、低效&#xff09;选择一个进程并将…

windows端口被占用问题,杀死进程

描述&#xff1a;端口被占用 在使用IntelliJ IDEA运行程序时&#xff0c;可能会遇到端口占用的情况&#xff0c;这通常由以下几个原因引起&#xff1a; 1、同一程序多次启动&#xff1a;如果你没有正确关闭之前运行的程序实例&#xff0c;再次尝试运行相同的程序时&#xff0c;…

数据库系统概论(超详解!!!) 第十四节 数据库恢复技术

1.事务的基本概念 1.事务 事务(Transaction)是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单位。 事务和程序是两个概念&#xff0c; 在关系数据库中&#xff0c;一个事务可以是一条SQL语句&#xff…