当前位置: 首页 > news >正文

C++ 设计模式:模板方法(Template Method)

链接:C++ 设计模式
链接:C++ 设计模式 - 策略模式
链接:C++ 设计模式 - 观察者模式

模板方法(Template Method)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。通过这种方式,子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。

1.问题分析

在开发中,经常会遇到一些操作,它们的整体步骤是固定的,但其中某些步骤的实现是可变的。模板方法通过将这些可变的步骤抽象出来,使得子类可以灵活地实现这些步骤,而不需要修改整体的算法结构。

2.实现步骤

  1. 定义抽象基类:在抽象基类中定义算法的骨架,并将可变的步骤声明为纯虚函数。
  2. 实现具体子类:在具体子类中实现这些可变的步骤。
  3. 调用算法:通过基类接口调用算法,具体的实现由子类提供。

3.代码示例

以机器人任务作为示例

3.1.抽象基类

class Robot {public:virtual ~Robot() = default;void performTask() {start();doTask();stop();}protected:void start() { std::cout << "Starting the robot" << std::endl; }void stop() { std::cout << "Stopping the robot" << std::endl; }// 抽象步骤,由子类实现virtual void doTask() = 0;
};

3.2.具体子类

// 具体机器人1,清扫机器人
class CleaningRobot : public Robot {protected:void doTask() override { std::cout << "Cleaning the floor" << std::endl; }
};
// 具体机器人2,巡逻机器人
class PatrollingRobot : public Robot {protected:void doTask() override { std::cout << "Patrolling the area" << std::endl; }
};

3.3.调用算法

int main() {CleaningRobot cleaningRobot;PatrollingRobot patrollingRobot;std::cout << "Cleaning robot task..." << std::endl;cleaningRobot.performTask();std::cout << "\nPatrolling robot task..." << std::endl;patrollingRobot.performTask();return 0;
}

模板方法模式是通过继承的方式,将算法的骨架定义在抽象类中,而具体步骤由子类实现。适用于算法步骤固定,但某些步骤需要定制的场景。

相关文章:

C++ 设计模式:模板方法(Template Method)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 策略模式 链接&#xff1a;C 设计模式 - 观察者模式 模板方法&#xff08;Template Method&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。通过这…...

GDPU Vue前端框架开发 跨年大礼包

目录 选择题 填空题 简答题 记住&#xff0c;年底陪你跨年的不会仅是方便面跟你的闺蜜&#xff0c;还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是&#xff08;&#xff09;。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根…...

搭建一个高效且安全的APP分发平台

搭建一个高效且安全的APP分发平台需要经历一系列精心规划和实施的步骤。以下是一个详细的指南&#xff0c;涵盖从准备阶段到后续维护阶段的各个环节&#xff1a; 一、准备阶段 明确目标与需求 确定平台的目标用户群体&#xff0c;了解他们的需求和偏好。分析竞争对手的分发平台…...

Leetcode打卡:二叉树中的链表

执行结果&#xff1a;通过 题目 1367 二叉树中的链表 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。 如果在二叉树中&#xff0c;存在一条一直向下的路径&#xff0c;且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值&#xff0c;那么请你返回 …...

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…...

算法 class 004(选择,冒泡,插入)

选择排序&#xff1a; 刚进入 j 循环的样子 j 跳出循环后&#xff0c;b 指向最小值的坐标 然后交换 i 和 b 位置的 值 随后 i , b i , i j1; 开始新一轮的排序&#xff0c; void SelectAQort(int* arr,int size)//选择排序 {for (int i 0; i < size-1; i){ //i 的位置就是…...

linux---awk命令详细教程

awk是一种强大的编程语言&#xff0c;用于在Linux/Unix系统下对文本和数据进行处理。以下是对awk的详细教程&#xff1a; 一、awk简介 awk由Alfred Aho、Brian Kernighan和Peter Weinberger三人开发&#xff0c;其名称分别代表这三位作者姓氏的第一个字母。awk支持用户自定义…...

一个通用的居于 OAuth2的API集成方案

在现代 web 应用程序中&#xff0c;OAuth 协议是授权和认证的主流选择。为了与多个授权提供商进行无缝对接&#xff0c;我们需要一个易于扩展和维护的 OAuth 解决方案。本文将介绍如何构建一个灵活的、支持多提供商的 OAuth 系统&#xff0c;包括动态 API 调用、路径参数替换、…...

STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计

SMEC88ST SDK开发包下载 目前市场上很多嵌入式产品方案都是可以破解复制的&#xff0c;主要是因为方案主芯片不具备防破解的功能&#xff0c;这就导致开发者投入大量精力、财力开发的新产品一上市就被别人复制&#xff0c;到市场上的只能以价格竞争&#xff0c;最后工厂复制的产…...

QML学习(五) 做出第一个简单的应用程序

通过前面四篇对QML已经有了基本的了解&#xff0c;今天先尝试做出第一个单页面的桌面应用程序。 1.首先打开Qt,创建项目&#xff0c;选择“QtQuick Application - Empty” 空工程。 2.设置项目名称和项目代码存储路径 3.这里要注意选择你的编译器类型&#xff0c;以及输出的程…...

深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制

深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制 目录 引言android.location包概述核心类解析 LocationManagerLocationProviderLocationCriteriaGpsStatusGpsStatus.ListenerLocationListener位置服务的工作原理位置信息的获取与处理GPS状态…...

【C++11】类型分类、引用折叠、完美转发

目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后&#xff0c;进一步对类型进行了划分&#xff0c;右值被划分纯右值(pure value&#xff0c;简称prvalue)和将亡值 (expiring value&#xff0c;简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…...

mongodb(6.0.15)安装注意事项,重装系统后数据恢复

window10系统 上周重装了系统&#xff0c;环境变量之类的都没有了。现在要恢复。 我电脑里之前的安装包没有删除&#xff08;虽然之前也没在C盘安装&#xff0c;但是找不到了&#xff0c;所以需要重新下载安装&#xff09;&#xff0c;长下图这样。这个不是最新版本&#xff0…...

union的实际使用

记录一下&#xff0c;免得忘记&#xff1a; 1、定义一个共用体变量 这里定义一个64位变量 i2creg_rev&#xff0c;然后通过共用体定义两个位变量bits和bits_reverse&#xff0c;通过bit可以访问指定位的值大小&#xff0c;不需要自己再左移右移转换。 bits_reverse是bits的对…...

EKF 自动匹配维度 MATLAB代码

该 M A T L A B MATLAB MATLAB代码实现了扩展卡尔曼滤波( E...

Oracle复合索引规则指南

在Oracle中可以创建组合索引&#xff0c;即同时包含两个或两个以上列的索引。在组合索引的使用方面&#xff0c;Oracle有以下特点&#xff1a; 1、 当使用基于规则的优化器&#xff08;RBO&#xff09;时&#xff0c;只有当组合索引的前导列出现在SQL语句的where子句中时&#…...

JS - Array Api

判断一个对象是否为数组 /* 语法&#xff1a; Array.isArray(object); 参数&#xff1a;object 必需&#xff0c;要测试的对象。返回值 如果 object 是数组&#xff0c;则为 true&#xff1b;否则为 false。 如果 object 参数不是对象&#xff0c;则返回 false。 */ 一、改…...

【JS】for-in 和 for-of遍历对象的区别

【介绍】 for-in 和 for-of 都是 JavaScript 中用于遍历数据结构的循环语句&#xff0c;但它们的工作原理和适用场景有所不同。特别是它们在遍历对象时的行为是不同的。 【区别】 for-in 遍历对象 for-in 是用于遍历对象的 可枚举属性的键名&#xff08;属性名&#xff09;…...

【每日学点鸿蒙知识】ets匿名类、获取控件坐标、Web显示iframe标签、软键盘导致上移、改变Text的背景色

1、HarmonyOS ets不支持匿名类吗&#xff1f; 不支持&#xff0c;需要显式标注对象字面量的类型&#xff0c;可以参考以下文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5#%E9%9C%80%E8%A6%81%E6%…...

深度学习blog- 数学基础(全是数学)

矩阵‌&#xff1a;矩阵是一个二维数组&#xff0c;通常由行和列组成&#xff0c;每个元素可以通过行索引和列索引进行访问。 张量‌&#xff1a;张量是一个多维数组的抽象概念&#xff0c;可以具有任意数量的维度。除了标量&#xff08;0D张量&#xff09;、向量&#xff08;…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...