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

模板方法模式的C++实现示例

核心思想

模板方法设计模式是一种行为设计模式,它定义了一个算法的框架,并将某些步骤的具体实现延迟到子类中。通过这种方式,模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。

模板方法模式的核心在于:
​1、定义一个算法的骨架:在父类中定义一个模板方法,该方法包含算法的步骤。
​2、延迟实现:将某些步骤的具体实现交给子类来完成。

使用场景

​固定流程,可变实现:当算法的整体流程是固定的,但某些步骤的具体实现可能不同时。
​代码复用:当多个类有相似的算法结构,但某些步骤的实现不同时,可以通过模板方法模式避免代码重复。
​框架设计:在框架设计中,模板方法模式常用于定义框架的核心流程,同时允许用户自定义某些步骤。

优点

​代码复用:将公共的算法逻辑放在父类中,避免重复代码。
​扩展性:子类可以灵活地重写某些步骤,而不影响算法的整体结构。
​控制流程:父类控制算法的流程,子类只负责实现细节。

缺点

​灵活性受限:由于算法的流程是固定的,子类只能改变某些步骤的实现,不能改变整体流程。
​继承的缺点:模板方法模式依赖于继承,如果子类过多,可能会导致类层次结构复杂。

示例代码

#include <iostream>
#include <string>// 抽象基类:定义模板方法
class DocumentProcessor {
public:// 模板方法:定义算法的骨架void processDocument() {openDocument();readDocument();if (needAnalyze()) {analyzeDocument();}saveDocument();closeDocument();}virtual ~DocumentProcessor() = default;protected:// 具体步骤的默认实现virtual void openDocument() {std::cout << "Opening document..." << std::endl;}virtual void readDocument() {std::cout << "Reading document..." << std::endl;}virtual void analyzeDocument() {std::cout << "Analyzing document..." << std::endl;}virtual void saveDocument() {std::cout << "Saving document..." << std::endl;}virtual void closeDocument() {std::cout << "Closing document..." << std::endl;}// 钩子方法:子类可以重写以改变算法的行为virtual bool needAnalyze() {return true;}
};// 具体子类:实现特定类型的文档处理
class PDFProcessor : public DocumentProcessor {
protected:void openDocument() override {std::cout << "Opening PDF document..." << std::endl;}void saveDocument() override {std::cout << "Saving PDF document..." << std::endl;}bool needAnalyze() override {return false;  // PDF 文档不需要分析}
};// 具体子类:实现另一种类型的文档处理
class WordProcessor : public DocumentProcessor {
protected:void openDocument() override {std::cout << "Opening Word document..." << std::endl;}void analyzeDocument() override {std::cout << "Analyzing Word document for spelling errors..." << std::endl;}void saveDocument() override {std::cout << "Saving Word document..." << std::endl;}
};int main() {// 处理 PDF 文档DocumentProcessor* pdfProcessor = new PDFProcessor();pdfProcessor->processDocument();delete pdfProcessor;std::cout << "------------------------" << std::endl;// 处理 Word 文档DocumentProcessor* wordProcessor = new WordProcessor();wordProcessor->processDocument();delete wordProcessor;return 0;
}

输出结果

Opening PDF document...
Reading document...
Saving PDF document...
Closing document...
------------------------
Opening Word document...
Reading document...
Analyzing Word document for spelling errors...
Saving Word document...
Closing document...

代码解析

DocumentProcessor 类
定义了模板方法 processDocument(),它包含了文档处理的固定流程。
提供了默认的步骤实现(如 openDocument()、readDocument() 等)。
提供了一个钩子方法 needAnalyze(),子类可以重写以改变算法的行为。
PDFProcessor 和 WordProcessor 类
继承自 DocumentProcessor,重写了某些步骤的具体实现。
PDFProcessor 禁用了分析步骤,而 WordProcessor 提供了特定的分析逻辑。
main 函数
分别使用 PDFProcessor 和 WordProcessor 处理文档,展示了模板方法模式的灵活性。

相关文章:

模板方法模式的C++实现示例

核心思想 模板方法设计模式是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并将某些步骤的具体实现延迟到子类中。通过这种方式&#xff0c;模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法模式的核心在于&#xff1a; ​…...

水下机器人推进器PID参数整定与MATLAB仿真

水下机器人推进器PID参数整定与MATLAB仿真 1. PID控制原理 目标:通过调节比例(P)、积分(I)、微分(D)参数,使推进器输出力快速稳定跟踪期望值。传递函数(示例):推进器动力学模型可简化为: [ G(s) = \frac{K}{\tau s + 1} \cdot e^{-Ts} ] 其中:K为增益,τ为时间常…...

在本地部署DeepSeek等大模型时,需警惕的潜在安全风险

在本地部署DeepSeek等大模型时&#xff0c;尽管数据存储在本地环境&#xff08;而非云端&#xff09;&#xff0c;但仍需警惕以下潜在安全风险&#xff1a; 1. 模型与数据存储风险 未加密的存储介质&#xff1a;若训练数据、模型权重或日志以明文形式存储&#xff0c;可能被物…...

智能焊机监测系统:打造工业安全的数字化盾牌

在现代工业生产中&#xff0c;焊机作为核心设备之一&#xff0c;其稳定性和安全性直接关系到生产效率和产品质量。德州迪格特科技有限公司推出的智能焊机监测系统&#xff0c;通过先进的技术手段&#xff0c;为工业生产构筑了一道坚固的安全防线。 智能监测&#xff0c;保障焊…...

【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX

文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串&#xff0c;value 的类型是存在差异的 二进制存储 Redis 中的字符串&#xff0c;直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据&#xff0c;还可…...

GaussDB安全配置指南:从认证到防御的全方面防护

一、引言 随着企业数据规模的扩大和云端化进程加速&#xff0c;数据库安全性成为运维的核心挑战之一。GaussDB作为一款高性能分布式数据库&#xff0c;提供了丰富的安全功能。本文将从 ​认证机制、权限控制、数据加密、审计日志​ 等维度&#xff0c;系统性地讲解如何加固 Ga…...

总结学习课程

1. 数据加载与预处理 PyTorch工具加载和预处理数据&#xff08;如MNIST数据集&#xff09;。 2. 定义模型 - 使用nn.Module构建神经网络&#xff0c;定义各层和前向传播。 3. 损失函数与优化器&#xff1a; 选择损失函数&#xff08;如交叉熵损失&#xff09;和优化…...

Ubuntu20.04搭建gerrit code review

一、环境准备 1. 安装 Java 环境‌ Gerrit 依赖 Java 运行环境&#xff08;推荐 JDK 8&#xff09;&#xff1a; sudo apt install openjdk-11-jdk 验证安装&#xff1a; java -version ‌2. 安装 Git sudo apt install git ‌3. 可选依赖 数据库‌&#xff1a;Gerrit …...

MacOS安装FFmpeg和FFprobe

按照网上很多教程安装&#xff0c;结果都失败了&#xff0c;后来才发现是路径问题&#xff0c;其实安装过程很简单&#xff08;无奈&#xff09; 第一步&#xff1a; 在官网下载 打开页面后&#xff0c;可以看到FFmpeg、FFprobe、FFplay和FFserver的下载图标 第二步&#xff1…...

Redis7系列:设置开机自启

前面的文章讲了Redis和Redis Stack的安装&#xff0c;随着服务器的重启&#xff0c;导致Redis 客户端无法连接。原来的是Redis没有配置开机自启。此文记录一下如何配置开机自启。 1、修改配置文件 前面的Redis和Redis Stack的安装的文章中已经讲了redis.config的配置&#xf…...

SpringAI介绍及本地模型使用方法

博客原文地址 前言 Spring在Java语言中一直稳居高位&#xff0c;与AI的洪流碰撞后也产生了一些有趣的”化学反应“&#xff0c;当然你要非要说碰撞属于物理反应也可以&#xff0c; 在经历了一系列复杂的反应方程后&#xff0c;Spring家族的新成员——SpringAI&#xff0c;就…...

Zookeeper实践指南

Zookeeper实践指南 1. 什么是 Zookeeper&#xff1f; Zookeeper 是 Apache 旗下的一个开源分布式协调框架&#xff0c;主要用于解决分布式系统中的一致性问题&#xff0c;提供高效可靠的分布式数据管理能力。 1.1 Zookeeper 的核心特性 顺序一致性&#xff1a;客户端的更新…...

Unity 基础知识总结(持续更新中...)

引擎基础 Unity有哪几个主要窗口&#xff1f; Scene窗口 用于场景搭建和UI界面拼接 Game窗口 游戏运行预览 Hierarchy窗口 查看和调整场景对象层级结构 Project窗口 游戏工程资源 Inspector创建 属性查看器&#xff0c;属性设置、脚本组件挂载 Unity提供了几种光源…...

IDEA接入阿里云百炼中免费的通义千问[2025版]

安装deepseek 上一篇文章IDEA安装deepseek最新教程2025中说明了怎么用idea安装codeGPT插件&#xff0c;并接入DeepSeek&#xff0c;无奈接入的官方api已经不能使用了&#xff0c;所以我们尝试从其他地方接入 阿里云百炼https://bailian.console.aliyun.com/ 阿里云百炼‌是阿…...

中级网络工程师面试题参考示例(1)

一、基础理论 1. OSI七层模型与TCP/IP四层模型的区别是什么&#xff1f;请举例说明第三层&#xff08;网络层&#xff09;和第四层&#xff08;传输层&#xff09;的核心协议。 参考答案&#xff1a; OSI七层模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用…...

主流大语言模型中Token的生成过程本质是串行的

主流大语言模型中Token的生成过程本质是串行的 flyfish 1. 串行生成 自回归模型的核心逻辑&#xff1a; 大模型&#xff08;如GPT-2&#xff09;采用自回归架构&#xff0c;每个Token的生成必须基于已生成的完整历史序列。例如&#xff0c;生成“今天天气很好”时&#xff1a…...

3.03-3.09 Web3 游戏周报:Sunflower Land 周留存率 74.2%,谁是本周最稳链游?

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.03–3.09】Web3 游戏行业动态 Sui 背后开发公司 Mysten Labs 宣布收购游戏开发平台 ParasolYescoin 创始人因合伙人纠纷被警方带走&#xff0c;案件升级为刑事案件Animoca B…...

高级java每日一道面试题-2025年2月18日-数据库篇-MySQL 如何做到高可用方案?

如果有遗漏,评论区告诉我进行补充 面试官: MySQL 如何做到高可用方案? 我回答: 在Java高级面试中&#xff0c;讨论MySQL如何实现高可用性方案是一个重要话题。这不仅涉及到数据库的稳定性和可靠性&#xff0c;还关系到系统的整体性能和用户体验。以下是结合提供的信息进行综…...

【编程题】7-5 堆中的路径

7-5 堆中的路径 1 题目原文2 思路解析3 代码实现 1 题目原文 题目链接&#xff1a;7-5 堆中的路径 将一系列给定数字插入一个初始为空的最小堆 h h h。随后对任意给定的下标 i i i&#xff0c;打印从第 i i i 个结点到根结点的路径。 输入格式: 每组测试第 1 1 1 行包含 …...

Scala 中的访问修饰符

在Scala中&#xff0c;面向对象的权限控制主要通过访问修饰符来实现。Scala提供了以下几种访问修饰符来控制类、对象、成员变量和方法的访问权限&#xff1a; 1. 默认访问权限&#xff08;无修饰符&#xff09; 如果没有指定任何访问修饰符&#xff0c;成员默认是public的&…...

flask_restx 定义任意类型参数

之前定义的content只是string&#xff0c;现在需要支持即可以string也可以list from flask_restx import fieldsclass Messages:def get_model(api):return api.model("Message",{"role": fields.String(requiredTrue, description"The role of messa…...

Unity3D网格简化与LOD技术详解

前言 在Unity3D游戏开发中&#xff0c;网格简化&#xff08;Mesh Simplification&#xff09;和细节层次&#xff08;Level of Detail, LOD&#xff09;技术是优化渲染性能的关键手段&#xff0c;尤其在处理复杂场景和高精度模型时至关重要。这两种技术通过减少模型的几何复杂…...

爬取数据时如何处理可能出现的异常?

在爬取数据时&#xff0c;处理可能出现的异常是确保爬虫稳定运行的关键。以下是一些常见的异常处理策略和具体实现方法&#xff0c;这些方法可以帮助你在爬虫开发中更有效地应对各种问题。 1. 使用 try-catch 块捕获异常 在PHP中&#xff0c;try-catch 块是处理异常的基本工具…...

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...

MPPT与PWM充电原理及区别详解

MPPT&#xff08;最大功率点跟踪&#xff09;和PWM&#xff08;脉宽调制&#xff09;是太阳能充电控制器中常用的两种技术&#xff0c;它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比&#xff1a; 1. 工作原理 PWM&#xff08;脉宽调制&#xff09; 核心机制…...

数据量过大的时候导出数据很慢

原因解析 速度慢无非两个原因: sql取数很慢程序很慢 sql很慢有3种原因: sql本身查询不合理,需要优化数据库没有索引多次频繁访问数据,造成了不必要的开销 取消多次获取数据,一次获取 框定一个大致的范围,获取此次查询的所有数据使用map设置数据,没有主键使用傅和主键拼接数据 /…...

NVIDIA k8s-device-plugin源码分析与安装部署

在《kubernetes Device Plugin原理与源码分析》一文中&#xff0c;我们从源码层面了解了kubelet侧关于device plugin逻辑的实现逻辑&#xff0c;本文以nvidia管理GPU的开源github项目k8s-device-plugin为例&#xff0c;来看看设备插件侧的实现示例。 一、Kubernetes Device Pl…...

langChainv0.3学习笔记(初级篇)

LangChain自0.1版本发布以来&#xff0c;已经历了显著的进化&#xff0c;特别是向AI时代的适应性提升。在0.1版本中&#xff0c;LangChain主要聚焦于提供基本的链式操作和工具集成&#xff0c;帮助开发者构建简单的语言模型应用。该版本适用于处理简单任务&#xff0c;但在应对…...

聚焦两会:科技与发展并进,赛逸展2025成创新新舞台

在十四届全国人大三次会议和全国政协十四届三次会议期间&#xff0c;代表委员们围绕多个关键议题展开深入讨论&#xff0c;为国家未来发展谋篇布局。其中&#xff0c;技术竞争加剧与经济转型需求成为两会焦点&#xff0c;将在首都北京举办的2025第七届亚洲消费电子技术贸易展&a…...

Xilinx ZYNQ FSBL解读:LoadBootImage()

篇首 最近突发奇想&#xff0c;Xilinx 的集成开发环境已经很好了&#xff0c;很多必要的代码都直接生成了&#xff0c;这给开发者带来了巨大便利的同时&#xff0c;也让人错过了很多代码的精彩&#xff0c;可能有很多人用了很多年了&#xff0c;都还无法清楚的理解其中过程。博…...