【设计模式之模板方法模式 -- C++】

模板方法模式 – 抽象父类,子类实现

模板方法设计模式是一种行为设计模式,它在父类中定义了一个操作的算法的骨架,而将一些步骤延迟到子类中实现。这样,可以在不改变算法结构的前提下,重新定义算法的某些特定步骤。模板方法模式是开发中非常常用的模式,主要是一下步骤:

步骤
  1. 定义抽象类(Abstract Class):首先,定义一个抽象基类,它声明了一系列的基本操作(可以是抽象的或具有默认实现的方法),以及一个模板方法。模板方法定义了一个算法的框架,按照某种顺序调用基本操作。

  2. 实现具体步骤:然后,创建具体子类,继承自抽象基类,并实现其基本操作。这些操作的具体实现会影响模板方法中算法的某些部分,但不会改变算法的结构。

  3. 调用模板方法:最后,客户端代码调用模板方法来执行算法。由于算法的结构已经在抽象类中定义,所以客户端不需要知道具体的实现细节。

模板方法模式的关键在于,它利用继承将算法的框架和实际的执行细节分离开来,使得子类可以在不改变算法结构的情况下,通过重定义某些步骤来改变算法的行为。

这种模式特别适用于有固定算法步骤,但各个步骤之间有细微差别的场景。通过模板方法模式,可以将这些步骤的实现延迟到子类中,提高代码的复用性和扩展性。

实现
  1. 抽象父类
class AbstractClass {
public:AbstractClass() {}virtual ~AbstractClass() {}// 模板方法void TemplateMethod() {PrimitiveOperation1();PrimitiveOperation2();}// 基本方法virtual void PrimitiveOperation1() = 0;virtual void PrimitiveOperation2() = 0;
};
  1. 子类实现
class ConcreteClassA : public AbstractClass {
public:ConcreteClassA() {}~ConcreteClassA() {}void PrimitiveOperation1() {cout << "ConcreteClassA PrimitiveOperation1" << endl;}void PrimitiveOperation2() {cout << "ConcreteClassA PrimitiveOperation2" << endl;}
};
  1. 测试
int main() {AbstractClass* p1 = new ConcreteClassA();p1->TemplateMethod();delete p1;return 0;
}
  1. 结果
ConcreteClassA PrimitiveOperation1
ConcreteClassA PrimitiveOperation2

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

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

相关文章

vue3父组件获取子组件实例(2024-06-22)

vue3获取子组件实例 在Vue 3中&#xff0c;可以使用ref来获取子组件的实例。首先&#xff0c;在父组件中需要引入ref&#xff0c;然后在模板中通过ref属性为子组件设置一个引用名称。之后&#xff0c;可以在父组件的setup函数中使用refAPI来访问子组件实例。 以下是一个简单的…

取代煤气灶,新能源电燃灶真有那么牛吗

在当今社会&#xff0c;能源问题日益凸显&#xff0c;能源危机的警钟不断敲响。与此同时&#xff0c;人们对于生活品质和安全环保的要求也越来越高。在这样的背景下&#xff0c;一种号称能取代燃气灶和电磁炉的新能源电燃灶——华火电燃灶进入了人们的视野。 华火电燃灶的出现似…

【区分vue2和vue3下的element UI Empty 空状态组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Element UI&#xff08;为 Vue 2 设计&#xff09;和 Element Plus&#xff08;为 Vue 3 设计&#xff09;中&#xff0c;Empty&#xff08;空状态&#xff09;组件通常用于在数据为空或没有内容时向用户展示一种占位提示。然而&#xff0c;需要注意的是&#xff0c;Element…

SpringBoot整合justauth实现多种方式的第三方登陆

目录 0.准备工作 1.引入依赖 2.yml文件 3. Controller代码 4.效果 参考 0.准备工作 你需要获取三方登陆的client-id和client-secret 以github为例 申请地址&#xff1a;Sign in to GitHub GitHub 1.引入依赖 <?xml version"1.0" encoding"UTF-8&quo…

Gflags的使用

目录 1. gflags 安装 2. gflags 使用 2.1 基本使用方法 2.2 基本使用实例 2.3 放入配置文件中 3. 融入cmakelists中使用 在实际工程代码开发中&#xff0c;发现gflags很好用&#xff0c;可以在运行 1. gflags 安装 gflags的安装使用apt-get install命令安装即可 sudo …

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下

1.从某超市顾客中随机抽取5名&#xff0c;他们的购物篮数据的二元0/1表示如下&#xff1a; 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…

Spring Security6 设置免登录接口地址

1. 在SecurityFilterChain中设置免登录接口地址。如果定义了多个SecurityFilterChain&#xff0c;并且前面的SecurityFilterChain里使用了anyRequest().authenticated()&#xff0c;后面的免登录可能会失效。 Configuration EnableWebSecurity public class SecurityConfig {B…

Linux常用命令(16)—awk命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

tessy 编译错误总结

目录 1,tessy 单元测试 TDE 界面 数据无法填充:the test object interface is incomplete 2,tessy 编译报错:单元测试时,普通桩函数内容相关异常场景 3,tessy 编译报错:模块分析后 头文件 找不到 4,tessy 集成测试:SCE界面component函数太多 5,tessy 编译报错:函…

Java 10新特性介绍

Java 10是Java平台的一个重要更新&#xff0c;它引入了多项新特性和改进。以下是一些主要的新特性&#xff1a; 局部变量类型推断&#xff08;var关键字&#xff09; Java 10允许使用var关键字来声明局部变量&#xff0c;而无需显式指定变量的类型。编译器会根据变量赋值的上下…

non_blocking=True 与 torch.cuda.synchronize()

需要注意的是&#xff1a;GPU和CPU之间是异步执行的&#xff0c;CPU向GPU下达指令以后会立刻执行之后的代码&#xff0c;CPU不会等待GPU执行完成 一、non_blockingTrue 目的&#xff1a;压缩gpu的效果&#xff0c;避免CPU与GPU设备数据传输时间开销带来的计算效率低下 在 P…

Android获取控件宽高的几种方式

第一种方式&#xff1a;在需要时获取&#xff0c;如控件点击时再获取 button.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { getTextWidthAndHeight(); } }); 第二种方式&#xff1a;重写onWindowFocusChanged()方法 Overr…

【SQL】varchar 与 char 的区别

在 SQL 中&#xff0c;VARCHAR 和 CHAR 是用于存储字符串类型数据的两种数据类型&#xff0c;但它们在存储方式和性能上有显著的区别。 CHAR 定义: CHAR 是一种固定长度的字符串数据类型。长度: 你需要在定义表结构时指定长度&#xff0c;例如 CHAR(10)。存储方式: 无论实际存…

【机器学习】机器学习赋能交通出行:智能化实践与创新应用探索

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 交通流量预测与优化&#x1f31e;数据准备&#x1f319;模型训练与预测⭐评估模型与优化 &#x…

jsonpath_解析例子代码

# _*_ coding : utf-8 _*_ # Time : 2023-11-05 13:23 # Author : haowen # File : jsonpath_解析_淘票票 # Project : py练习 import urllib.request url https://dianying.taobao.com/cityAction.json?activityId&_ksTS1699161894273_112&jsoncallbackjsonp113&…

网页抓取单词关联

在当今数字化的时代&#xff0c;数据的获取与处理成为了众多企业和开发者关注的焦点。API 服务的出现&#xff0c;为我们打开了高效、便捷获取和利用数据的新大门。接下来&#xff0c;为您介绍几款独具特色的 API 服务&#xff0c;它们将为您的业务和开发工作带来前所未有的便利…

ABB机械手3HAC024518-001电机振动过大维修方案

【ABB机械臂伺服电机维修方案】 1. 更换轴承 如果检查发现轴承磨损&#xff0c;我们需要更换新的轴承。请选择与原轴承型号相同的产品&#xff0c;以确保电机正常运行。 2. 重新平衡转子 如果ABB机械手3HAC024518-001电机转子不平衡&#xff0c;我们需要重新平衡转子。这可以通…

棉花叶子病害分类数据集3601张6类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;3601 分类类别数&#xff1a;6 类别名称:[“aphids”,“army_worm”,“bact…

小熊文件工具箱免费版

小熊文件工具箱是一款基于本地离线操作的一系列工具的合集&#xff0c;最大特点是各种批量任务的执行&#xff0c;包含了智能证件照&#xff0c;自动抠图&#xff0c;直播录制&#xff0c;九宫格切图&#xff0c;拼图&#xff0c;视频格式转换及压缩&#xff0c;zip压缩解压缩&…

Python一文轻松搞定正则匹配

一、前言 日常工作中&#xff0c;不可避免需要进行文件及内容的查找&#xff0c;替换操作&#xff0c;python的正则匹配无疑是专门针对改场景而出现的&#xff0c;灵活地运用可以极大地提高效率&#xff0c;下图是本文内容概览。 ​ 二、正则表达式符号 对于所有的正则匹配表达…