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

C++中的模板方法模式

目录

模板方法模式(Template Method Pattern)

实际应用

数据处理流程

在线教育系统的课程模板

软件开发生命周期

总结


模板方法模式(Template Method Pattern)

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

实际应用

数据处理流程

-- 有一个数据处理流程,该流程包含读取数据、处理数据和保存数据的步骤。

#include <iostream>
#include <vector>// 抽象基类
class DataProcessor {
public:// 模板方法void process() {readData();processData();saveData();}// 基类定义的钩子方法(可选)virtual void readData() = 0;virtual void processData() = 0;virtual void saveData() {std::cout << "Saving data to default location." << std::endl;}virtual ~DataProcessor() = default;
};// 具体实现类:处理CSV数据
class CSVDataProcessor : public DataProcessor {
public:void readData() override {std::cout << "Reading data from CSV file." << std::endl;}void processData() override {std::cout << "Processing CSV data." << std::endl;}void saveData() override {std::cout << "Saving processed CSV data to database." << std::endl;}
};// 具体实现类:处理JSON数据
class JSONDataProcessor : public DataProcessor {
public:void readData() override {std::cout << "Reading data from JSON file." << std::endl;}void processData() override {std::cout << "Processing JSON data." << std::endl;}void saveData() override {std::cout << "Saving processed JSON data to cloud storage." << std::endl;}
};// 客户端代码
int main() {CSVDataProcessor csvProcessor;JSONDataProcessor jsonProcessor;std::cout << "Processing CSV data:" << std::endl;csvProcessor.process();std::cout << "\nProcessing JSON data:" << std::endl;jsonProcessor.process();return 0;
}

在线教育系统的课程模板

-- 在线教育系统,其中课程模板的每种类型的课程都有不同的实现方式,例如录制课程和现场课程。

#include <iostream>// 抽象基类
class OnlineCourse {
public:// 模板方法void createCourse() {createContent();deliverContent();provideFeedback();}// 基类定义的钩子方法(可选)virtual void createContent() = 0;virtual void deliverContent() = 0;virtual void provideFeedback() {std::cout << "Providing standard feedback." << std::endl;}virtual ~OnlineCourse() = default;
};// 具体实现类:录制课程
class RecordedCourse : public OnlineCourse {
public:void createContent() override {std::cout << "Creating recorded content." << std::endl;}void deliverContent() override {std::cout << "Delivering recorded content." << std::endl;}void provideFeedback() override {std::cout << "Providing feedback for recorded content." << std::endl;}
};// 具体实现类:现场课程
class LiveCourse : public OnlineCourse {
public:void createContent() override {std::cout << "Preparing live session content." << std::endl;}void deliverContent() override {std::cout << "Delivering live session." << std::endl;}void provideFeedback() override {std::cout << "Providing live session feedback." << std::endl;}
};// 客户端代码
int main() {RecordedCourse recordedCourse;LiveCourse liveCourse;std::cout << "Creating Recorded Course:" << std::endl;recordedCourse.createCourse();std::cout << "\nCreating Live Course:" << std::endl;liveCourse.createCourse();return 0;
}

软件开发生命周期

-- 简单的软件开发生命周期模板,该模板包含需求分析、设计、开发和测试等步骤。

#include <iostream>// 抽象基类
class SoftwareDevelopmentLifecycle {
public:// 模板方法void develop() {requirementsAnalysis();design();development();testing();deployment();}// 基类定义的钩子方法(可选)virtual void requirementsAnalysis() = 0;virtual void design() = 0;virtual void development() = 0;virtual void testing() = 0;virtual void deployment() {std::cout << "Deploying software to production." << std::endl;}virtual ~SoftwareDevelopmentLifecycle() = default;
};// 具体实现类:Web项目
class WebProject : public SoftwareDevelopmentLifecycle {
public:void requirementsAnalysis() override {std::cout << "Gathering requirements for web project." << std::endl;}void design() override {std::cout << "Designing web project architecture." << std::endl;}void development() override {std::cout << "Developing web application." << std::endl;}void testing() override {std::cout << "Testing web application." << std::endl;}void deployment() override {std::cout << "Deploying web application to cloud server." << std::endl;}
};// 具体实现类:移动应用项目
class MobileAppProject : public SoftwareDevelopmentLifecycle {
public:void requirementsAnalysis() override {std::cout << "Gathering requirements for mobile app project." << std::endl;}void design() override {std::cout << "Designing mobile app architecture." << std::endl;}void development() override {std::cout << "Developing mobile application." << std::endl;}void testing() override {std::cout << "Testing mobile application." << std::endl;}void deployment() override {std::cout << "Deploying mobile application to app store." << std::endl;}
};// 客户端代码
int main() {WebProject webProject;MobileAppProject mobileAppProject;std::cout << "Developing Web Project:" << std::endl;webProject.develop();std::cout << "\nDeveloping Mobile App Project:" << std::endl;mobileAppProject.develop();return 0;
}

总结

模板方法模式通过定义算法骨架,并将具体步骤延迟到子类中,使得算法结构的变化独立于具体实现,可以提高代码的复用性和维护性。

相关文章:

C++中的模板方法模式

目录 模板方法模式&#xff08;Template Method Pattern&#xff09; 实际应用 数据处理流程 在线教育系统的课程模板 软件开发生命周期 总结 模板方法模式&#xff08;Template Method Pattern&#xff09; 模板方法模式是一种行为设计模式&#xff0c;它定义了一个操作…...

【数据结构】第十七弹---C语言实现选择排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、选择排序 1.1、基本思想 1.2、代码实现 1.3、代码测试 1.4、时空复杂度分析 总结 1、选择排序 1.1、基本思想 选择排序是一种简单直观的比…...

信号处理中的梯型权重操作(Tapering)

目录 1. 引言2. 一个Tapering操作的例子3. Tapering操作的简单实现延伸阅读1. 引言 Tapering 操作是对信号数据在水平和垂直方向上应用梯形权重,这个操作可以减弱数据边界效应,从而在进行傅里叶变换时减少伪影和边缘效应。本文将通过一个简单的例子来展示 Tapering 操作的具…...

深入解析分布式链路追踪:原理、技术及应用

目录 分布式链路追踪简介分布式链路追踪的基本概念 Span 和 Trace上下文传播采样策略 分布式链路追踪的工作原理常见的分布式链路追踪系统 ZipkinJaegerOpenTelemetry 分布式链路追踪的技术实现 数据收集数据传输数据存储数据展示 分布式链路追踪的应用场景 性能优化故障排除依…...

2024信息系统、信号处理与通信技术国际会议(ICISPCT2024)

2024信息系统、信号处理与通信技术国际会议&#xff08;ICISPCT2024) 会议简介 2024国际信息系统、信号处理与通信技术大会&#xff08;ICISPCT2024&#xff09;将在青岛隆重开幕。本次会议旨在汇聚全球信息系统、信号处理和通信技术领域的专家学者&#xff0c;共同探索行业…...

用这个神级提示词插件,能让你的AI绘画工具Stable diffusion提示词直接写中文!

大家好&#xff0c;我是设计师阿威 最近&#xff0c;有同学在使用AI绘画工具 Stable Diffusion的时候和我说&#xff1a;老师&#xff0c;我英文不好&#xff0c;能不能直接让我写中文提示词啊&#xff1f;最好可以直接在SD的输入框就能直接写中文&#xff0c;不用切换网页或者…...

Android里的设计模式

一&#xff1a;设计模式分类 经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides&#xff08;合称“Gang of Four”&#xff09;在他们的书《设计模式&#xff1a;可复用面向对象软件的基础》中定义的。以下是这些设计模式的分类和简要介绍。 1.…...

token无感刷新

Token无感刷新通常指的是在用户不知情的情况下自动刷新认证Token&#xff0c;以保持用户的会话状态。这通常在使用JWT&#xff08;JSON Web Tokens&#xff09;作为认证方式时使用。以下是实现无感刷新的一种常见方法&#xff1a; 1. 前端请求拦截&#xff1a; 在发送请求前&a…...

Golang的协程调度器GMP

目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器&#xff0c;它包含了运行协程的资源&#xff0c;如果线程想运行协程&#xff0c;必须先获取P&#xff0c;P中还包含了可运行的G…...

C++ 后端,Vue前端

参考2篇博客 1-VUE、C前后端调用 2-Vue解决CORS header ‘Access-Control-Allow-Origin’ missing及同源、跨域问题 这里给出App.vue代码 <script setup lang"ts"> import HelloWorld from ./components/HelloWorld.vueimport axios from axios import { ref…...

使用Navicat Premium向mysql插入2000000条数据

DELIMITER // DROP PROCEDURE IF EXISTS sys_log; CREATE PROCEDURE sys_log() BEGIN DECLARE n int DEFAULT 1; WHILE(n<2000000) DO INSERT INTO sys_log VALUES (n, 超级系统管理员, 查询实时工况数据, /keyParameterMonitoring/getNewestUnitData, {\"role\"…...

docker命令记录

基本命令和参数 docker run: 运行一个新的容器实例。-itd: 组合参数&#xff0c;含义如下&#xff1a; -i: 以交互模式运行容器&#xff0c;保持标准输入打开。-t: 分配一个伪终端。-d: 后台运行容器&#xff0c;即使容器启动后依然返回控制台。 设备映射 --device/dev/dri…...

Java学习七

Java包 String对象 String案例 集合 ArrayList 集合...

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…...

数据结构预备知识(Java):包装类泛型

1、包装类 1.1 包装类 在Java中&#xff0c;每一个基本数据类型都有一个对应的包装类&#xff1a; 在SE的学习中我们已有过简单了解。 我们可以注意到&#xff0c;除了int类型的包装类为Integer&#xff0c;char类型的包装类为Character外&#xff0c;其余基本类型的包装类均…...

掌握Linux Vim:从基础到高级的全面指南

Vim是一款在Linux世界中备受推崇的文本编辑器,它以其强大的功能和高效的操作模式闻名于世。尽管Vim的学习曲线较陡,但一旦掌握,你将发现它在代码编辑和文本处理方面的无与伦比的优势。本文将从Vim的基础知识开始,逐步深入到高级用法和技巧,帮助你全面掌握这款强大的编辑器…...

打好“组合拳”,实现国有企业降本增效

在当前经济不确定性加剧、市场寒意明显的背景下&#xff0c;众多国有企业因历史积累的管理问题而陷入困境。随着经济形势的严峻&#xff0c;各行业普遍出现发展乏力的现象&#xff0c;促使企业开始重视“修炼内功”、“向内挖潜”&#xff0c;试图控制成本&#xff0c;以确保平…...

四川古力未来科技有限公司抖音小店解锁电商新机遇

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。四川古力未来科技有限公司紧跟时代步伐&#xff0c;积极拥抱变革&#xff0c;在抖音平台上开设小店&#xff0c;为品牌发展注入了新的活力。那么&#xff0c;四川古力未来科技有限公司抖音小店究竟…...

Maven之介绍

目录 一、简介 &#xff08;2&#xff09;为什么学习Maven&#xff1f; 二、小结 一、简介 &#xff08;1&#xff09;Maven 是一个 Java 项目管理和构建工具。它可以定义项目结构、项目依赖&#xff0c;并使用统一的方式进行自动化构建&#xff0c;是Java项目不可缺少的工具…...

简单了解java中的File类

1、File类 1.1、概述 File对象就表示一个路径&#xff0c;可以是文件路径也可以是文件夹路径&#xff0c;这个路径可以 是存在的&#xff0c;也可以是不存在的。 1.2、常见的构造方法 方法名称说明public File&#xff08;String pathname&#xff09;根据文件路径创建文件…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...