C++ 设计模式:模板方法(Template Method)
链接:C++ 设计模式
链接:C++ 设计模式 - 策略模式
链接:C++ 设计模式 - 观察者模式
模板方法(Template Method)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。通过这种方式,子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
1.问题分析
在开发中,经常会遇到一些操作,它们的整体步骤是固定的,但其中某些步骤的实现是可变的。模板方法通过将这些可变的步骤抽象出来,使得子类可以灵活地实现这些步骤,而不需要修改整体的算法结构。
2.实现步骤
- 定义抽象基类:在抽象基类中定义算法的骨架,并将可变的步骤声明为纯虚函数。
- 实现具体子类:在具体子类中实现这些可变的步骤。
- 调用算法:通过基类接口调用算法,具体的实现由子类提供。
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)
链接:C 设计模式 链接:C 设计模式 - 策略模式 链接:C 设计模式 - 观察者模式 模板方法(Template Method)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。通过这…...
GDPU Vue前端框架开发 跨年大礼包
目录 选择题 填空题 简答题 记住,年底陪你跨年的不会仅是方便面跟你的闺蜜,还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是()。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根…...
搭建一个高效且安全的APP分发平台
搭建一个高效且安全的APP分发平台需要经历一系列精心规划和实施的步骤。以下是一个详细的指南,涵盖从准备阶段到后续维护阶段的各个环节: 一、准备阶段 明确目标与需求 确定平台的目标用户群体,了解他们的需求和偏好。分析竞争对手的分发平台…...
Leetcode打卡:二叉树中的链表
执行结果:通过 题目 1367 二叉树中的链表 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。 如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 …...
大数据技术-Hadoop(四)Yarn的介绍与使用
目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler(容量调度器) 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…...
算法 class 004(选择,冒泡,插入)
选择排序: 刚进入 j 循环的样子 j 跳出循环后,b 指向最小值的坐标 然后交换 i 和 b 位置的 值 随后 i , b i , i j1; 开始新一轮的排序, void SelectAQort(int* arr,int size)//选择排序 {for (int i 0; i < size-1; i){ //i 的位置就是…...
linux---awk命令详细教程
awk是一种强大的编程语言,用于在Linux/Unix系统下对文本和数据进行处理。以下是对awk的详细教程: 一、awk简介 awk由Alfred Aho、Brian Kernighan和Peter Weinberger三人开发,其名称分别代表这三位作者姓氏的第一个字母。awk支持用户自定义…...
一个通用的居于 OAuth2的API集成方案
在现代 web 应用程序中,OAuth 协议是授权和认证的主流选择。为了与多个授权提供商进行无缝对接,我们需要一个易于扩展和维护的 OAuth 解决方案。本文将介绍如何构建一个灵活的、支持多提供商的 OAuth 系统,包括动态 API 调用、路径参数替换、…...
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
SMEC88ST SDK开发包下载 目前市场上很多嵌入式产品方案都是可以破解复制的,主要是因为方案主芯片不具备防破解的功能,这就导致开发者投入大量精力、财力开发的新产品一上市就被别人复制,到市场上的只能以价格竞争,最后工厂复制的产…...
QML学习(五) 做出第一个简单的应用程序
通过前面四篇对QML已经有了基本的了解,今天先尝试做出第一个单页面的桌面应用程序。 1.首先打开Qt,创建项目,选择“QtQuick Application - Empty” 空工程。 2.设置项目名称和项目代码存储路径 3.这里要注意选择你的编译器类型,以及输出的程…...
深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制
深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制 目录 引言android.location包概述核心类解析 LocationManagerLocationProviderLocationCriteriaGpsStatusGpsStatus.ListenerLocationListener位置服务的工作原理位置信息的获取与处理GPS状态…...
【C++11】类型分类、引用折叠、完美转发
目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后,进一步对类型进行了划分,右值被划分纯右值(pure value,简称prvalue)和将亡值 (expiring value,简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…...
mongodb(6.0.15)安装注意事项,重装系统后数据恢复
window10系统 上周重装了系统,环境变量之类的都没有了。现在要恢复。 我电脑里之前的安装包没有删除(虽然之前也没在C盘安装,但是找不到了,所以需要重新下载安装),长下图这样。这个不是最新版本࿰…...
union的实际使用
记录一下,免得忘记: 1、定义一个共用体变量 这里定义一个64位变量 i2creg_rev,然后通过共用体定义两个位变量bits和bits_reverse,通过bit可以访问指定位的值大小,不需要自己再左移右移转换。 bits_reverse是bits的对…...
EKF 自动匹配维度 MATLAB代码
该 M A T L A B MATLAB MATLAB代码实现了扩展卡尔曼滤波( E...
Oracle复合索引规则指南
在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引。在组合索引的使用方面,Oracle有以下特点: 1、 当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的where子句中时&#…...
JS - Array Api
判断一个对象是否为数组 /* 语法: Array.isArray(object); 参数:object 必需,要测试的对象。返回值 如果 object 是数组,则为 true;否则为 false。 如果 object 参数不是对象,则返回 false。 */ 一、改…...
【JS】for-in 和 for-of遍历对象的区别
【介绍】 for-in 和 for-of 都是 JavaScript 中用于遍历数据结构的循环语句,但它们的工作原理和适用场景有所不同。特别是它们在遍历对象时的行为是不同的。 【区别】 for-in 遍历对象 for-in 是用于遍历对象的 可枚举属性的键名(属性名)…...
【每日学点鸿蒙知识】ets匿名类、获取控件坐标、Web显示iframe标签、软键盘导致上移、改变Text的背景色
1、HarmonyOS ets不支持匿名类吗? 不支持,需要显式标注对象字面量的类型,可以参考以下文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5#%E9%9C%80%E8%A6%81%E6%…...
深度学习blog- 数学基础(全是数学)
矩阵:矩阵是一个二维数组,通常由行和列组成,每个元素可以通过行索引和列索引进行访问。 张量:张量是一个多维数组的抽象概念,可以具有任意数量的维度。除了标量(0D张量)、向量(…...
提升开发效率的跨平台游戏开发框架:从概念到发布的全流程指南
提升开发效率的跨平台游戏开发框架:从概念到发布的全流程指南 【免费下载链接】FXGL Java / JavaFX / Kotlin Game Library (Engine) 项目地址: https://gitcode.com/gh_mirrors/fx/FXGL 价值定位:为何选择FXGL游戏开发框架 在游戏开发领域&…...
3步快速上手:B站评论区智能成分检测工具完整指南
3步快速上手:B站评论区智能成分检测工具完整指南 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分油猴脚本,主要为原神玩家识别 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-comment-checker 你是否曾在B站评论区看到…...
十分钟搞定飞书机器人:用快马平台快速原型化你的openclaw应用
最近在做一个飞书机器人的小项目,发现用openclaw框架配合InsCode(快马)平台可以快速完成原型验证,整个过程比想象中简单很多。这里分享一下我的实践过程,从零开始十分钟就能跑通一个基础功能的飞书机器人。 项目准备阶段 传统开发需要先配置本…...
如何用OpCore Simplify一键生成黑苹果EFI配置?新手也能轻松掌握的完整方案
如何用OpCore Simplify一键生成黑苹果EFI配置?新手也能轻松掌握的完整方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配…...
QwQ-32B与Token技术实现安全认证系统
QwQ-32B与Token技术实现安全认证系统 1. 引言 在现代应用开发中,安全认证系统是保护用户数据和系统资源的第一道防线。传统的认证方案往往面临诸多挑战:复杂的密码策略让用户头疼,静态的访问控制难以应对动态的业务需求,而多因素…...
Fourier Neural Operator (FNO) 在偏微分方程求解中的核心思想与应用
1. 从传统方法到FNO:偏微分方程求解的进化之路 偏微分方程(PDE)在工程和科学领域无处不在,从天气预报到飞机设计,从量子力学到金融衍生品定价。传统数值解法如有限差分法(FDM)和有限元法&#x…...
嵌入式必看学习路线
嵌入式学习路线第一阶段:C语言基础(必须扎实)数据类型:字符型(char)、短整型(short)、整型(int)、 长整型(long)、超长整形(long long)、…...
G-Helper开源工具性能优化完全指南:从问题诊断到高级配置
G-Helper开源工具性能优化完全指南:从问题诊断到高级配置 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...
RBTray完全指南:Windows任务栏清理终极解决方案
RBTray完全指南:Windows任务栏清理终极解决方案 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否经常感到Windows任务栏拥挤不堪?各种后台程序…...
Ventoy RAID启动解决方案:突破存储阵列引导瓶颈的实战指南
Ventoy RAID启动解决方案:突破存储阵列引导瓶颈的实战指南 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 在服务器部署和高端PC应用中,从RAID阵列→磁盘冗余存储技术启动系统往…...
