C++设计模式---模版方法模式

1、介绍

概念:

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

包含部分:

(1)AbstractClass:抽象类

        在抽象类中定义一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个步骤,在其子类中可以重复定义并实现一个算法的各个步骤。

(2)ConcreteClass:具体子类

        具体子类是抽象类的子类,用于实现在父类中定义的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中实现的具体基本操作。

优点:

        (1)模板方法模式可以在子类中定义详细的处理算法时不会改变算法的结构。

        (2)是一种类库技术,提取累的公共行为,将公共行为放在父类中,而通过其子类可以实现不同的行为。

        (3)提供了一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展而增加新行为。

缺点:

        每个不同的实现都需要定义一个子类,会导致子类数量的增加。

2、示例

在车管所给电动车、机动车办理车证业务。

#include<iostream>class CarTemplateMethod                   // 车管所办理业务
{
public:void takeNumber(){                    // 取号std::cout << "take a number" << std::endl;}virtual void transact() = 0;          // 办理业务。具体的业务流程在子类中实现void evaluate()                       // 反馈评分{std::cout << "Feedback rating" << std::endl;}void process()                        // 办理具体业务{takeNumber();transact();evaluate();std::cout << "===============================" << std::endl;}
};class ElectricVehicle:public CarTemplateMethod    // 电动车办证
{virtual void transact(){std::cout << "take Electric Vehicle service" << std::endl;}};class MotorVehicle:public CarTemplateMethod      // 机动车办证
{virtual void transact(){std::cout << "take Motor Vehicle service" << std::endl;}};int main()
{CarTemplateMethod* carTemplateMethod= new ElectricVehicle();carTemplateMethod->process();carTemplateMethod= new MotorVehicle();carTemplateMethod->process();delete carTemplateMethod;return 0;
}

结果:

take a number
take Electric Vehicle service
Feedback rating
===============================
take a number
take Motor Vehicle service
Feedback rating
===============================

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画Stable Diffusion人物背景替换实操教程,让创意无限延伸

大家好&#xff0c;我是画画的小强 Stable Diffusion以其强大的能力可以实现人物背景的更换。本文将带你深入了解如何利用Stable Diffusion中的Inpaint Anything插件快速且精准地实现人物背景的替换&#xff0c;从而让你的图片焕发新生。 前期准备 本文会使用到Inpaint Anyt…

密码学及其应用——专用名词(法语版)

1. 密码学概念 1. cryptographie - 密码学 2. cryptosystme - 密码系统 3. cryptographie symtrique - 对称密码学 4. cryptographie asymtrique - 非对称密码学 5. cryptographie quantique - 量子密码学 6. stganographie - 隐写术 2. 加密与解密 1. cryptage - 加密 2. dc…

如何优化Spring Boot应用的启动时间

如何优化Spring Boot应用的启动时间 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将讨论如何优化Spring Boot应用的启动时间&#xff0c;提升应用的性…

代码随想录算法训练营第六天|242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

打卡Day6 1.哈希表理论基础2.242.有效的字母异位词2.349. 两个数组的交集3.202. 快乐数4.1. 两数之和 1.哈希表理论基础 文档讲解&#xff1a; 代码随想录 当遇到要快速判断一个元素是否出现在集合中时&#xff0c;要考虑哈希法。但是哈希法牺牲了空间换取了时间&#xff0c;…

观星观景大屏呈现 实时拍摄长焦定格 当当狸智能天文望远镜TW2来啦

《宇宙的奇迹》中有这样一句话&#xff1a;“我们与那些遥远星系息息相关&#xff0c;无论它们是如何与我们天各一方&#xff0c;那些经过数十亿年旅行到达地球的光线&#xff0c;终究会把我们联系在一起”。 想象一下—— 等到繁星低垂&#xff0c;月光皎洁之时&#xff0c;…

随机森林回归原理详解及Python代码示例

随机森林回归原理详解 随机森林回归&#xff08;Random Forest Regression&#xff09;是一种集成学习方法&#xff0c;通过构建多个决策树并将它们的预测结果进行平均&#xff0c;来提高模型的稳定性和预测准确性。它通过引入随机性来增强模型的泛化能力&#xff0c;有效减轻了…

【SQL Server数据库】存储过程的使用

目录 一、要求 1&#xff0e;创建一个存储过程 Proc_Course&#xff0c;查看“0108”号课程的选修情况&#xff0c;包括学生学号、姓名和成绩&#xff0c;然后执行该过程 2&#xff0e;创建一个存储过程 Proc_SC1&#xff0c;通过学生学号来查询学生选修情况&#xff0c;默认…

Spring Cloud Gateway 跨域配置和跨服务请求跟踪

文章目录 引言I Spring Cloud Gateway 跨域配置1.1 网关统一处理:配置文件-推荐1.2 网关统一处理:配置类方式1.3 微服务处理,网关侧不用处理CORS。1.4 子服务依赖配置1.5 网关服务的依赖配置II 跨服务请求日志跟踪2.1 feign 依赖配置2.2 feign子模块将请求头中的参数,全部作…

Linux系统安装和卸载nginx

&#x1f4d6;Linux系统安装和卸载nginx ✅下载✅安装✅启动nginx✅安装成系统服务✅常见问题&#xff1a;80端口被占用了✅卸载✅目录结构 以下介绍的是以源码编译安装方式&#xff1a; ✅下载 官方地址&#xff1a;https://nginx.org/en/download.html 123云盘地址&#x…

pytest的搜索路径和导入模式

搜索路径 指定路径下面所有的 test_*.py or *_test.py 文件 中的所有以test前缀的方法。或者Test前缀类下的所有test 前缀的方法。不管是不是staticmethod and classmethods 官方文档 https://docs.pytest.org/en/8.2.x/explanation/goodpractices.html#test-discovery base…

基于springboot、vue影院管理系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 影城管理系统的主要使用者分为管理员和用户&#xff0c; 实现功能包括管理员&#xff1a; 首页…

如何在 Node.js 中使用文件系统

前言&#xff1a;Web 应用程序并不总是需要写入文件系统&#xff0c;但 Node.js 提供了一个全面的应用程序编程接口 (API) 来实现这一点。如果您要输出调试日志、将文件传输到服务器或从服务器传输文件&#xff0c;或者创建命令行工具&#xff0c;那么它可能是必不可少的。 值得…

ELK集群设置密码

一、软件安装清单 elasticsearch7.17.22logstash7.17.22kibana:7.17.22filebeat7.17.22elasticsearch-head:5 二、配置 生成证书 进入elasticsearch容器 bin/elasticsearch-certutil cert -out /usr/share/elasticsearch/config/elastic-certificates.p12 -pass将证书拷贝…

HTML DOM 修改 HTML 内容

HTML DOM 修改 HTML 内容 HTML DOM(文档对象模型)是 HTML 和 XML 文档的编程接口。它提供了对文档的结构化表示,并定义了一种方式来访问和操作文档的内容、结构和样式。在网页开发中,使用 HTML DOM 可以动态地修改 HTML 元素的内容、属性和样式。 基本概念 在 HTML DOM …

在Ubuntu上安装和配置配置服务器防火墙(CSF)的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Config Server Firewall&#xff08;CSF&#xff09;是大多数 Linux 发行版和基于 Linux 的 VPS 的免费高级防火墙。除了基本的防…

qt for android 工程添加AndroidManifest.xml 文件

1.选择左边图形栏目中的Projects&#xff0c;在Build steps下的Build Android APK中Details 2.点击Create Templates&#xff0c;并勾选 此时在工程下面会多出一个文件夹android 3.将这个android的中所有文件加入工程中&#xff0c;编辑.pro 4.通过QT 图形化编辑设置属性&#…

JAVA【案例5-5】二月天

【二月天】 1、案例描述 二月是一个有趣的月份&#xff0c;平年的二月有28天&#xff0c;闰年的二月由29天。闰年每四年一次&#xff0c;在判断闰年时&#xff0c;可以使用年份除于4&#xff0c;如果能够整除&#xff0c;则该年是闰年。 本案例要求编写一个程序&#xff0c;…

项目前端遇到的相关问题及解决办法

一.在IDEA中修改html文件后,网页却不更新,即使重启服务,页面也不更新 由于本地静态网页缓存,导致浏览器不访问服务器的新资源,解决办法如下: 打开网页后,按“F12”调出“开发人员工具”。长按浏览器左上角的“刷新”按钮直至弹出对话框,选择“清空缓存并进行硬刷新”。…

python e怎么表示

exp()方法返回x的指数&#xff0c;ex。 语法 以下是 exp() 方法的语法: import math math.exp( x ) 注意&#xff1a;exp()是不能直接访问的&#xff0c;需要导入 math 模块&#xff0c;通过静态对象调用该方法。 参数 x -- 数值表达式。 返回值 返回x的指数&#xff0c;…

01背包问题求解

来源于 https://kamacoder.com/problempage.php?pid1046 使用动态规划&#xff0c;五步走 1.定义状态数组和具体状态含义&#xff1a; dp是个二维数组&#xff0c;第一维代表物品索引&#xff0c;第二维代表背包空间状态。 dp[i][j]是指物品i 在背包空间j 的情况下所能放的…