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

C++设计模式 - 模板模式

一:概述

        模板方法(Template Method)是一种行为型设计模式。它定义了一个算法的基本框架,并且可能是《设计模式:可复用面向对象软件的基础》一书中最常用的设计模式之一。

        模板方法的核心思想很容易理解。我们需要定义一个包含多个固定步骤的算法框架。具体的实现类只能重写这些步骤,但不能改变整体框架。这些步骤通常被称为钩子方法(hook methods)。

 二:设计思想

  • 定义一个包含多个典型步骤的算法框架。
  • 子类可以调整这些步骤,但不能改变整体框架。

三:使用场景

  • 需要使用算法的不同版本。
  • 这些算法版本由相似的步骤组成。

四:模式结构

AbstractClass(抽象类)

  • 定义算法的结构,由多个步骤组成。
  • 算法的步骤可以是虚函数或纯虚函数。

ConcreteClass(具体类)

  • 根据需要重写算法的特定步骤。

五:代码示例

#include <iostream>// 抽象基类,定义模板方法
class Meal {
public:// 模板方法,final 关键字确保子类不能重写该方法void prepareMeal() {  boilWater();              // 步骤 1:烧水cook();                   // 步骤 2:烹饪,子类需要实现serve();                  // 步骤 3:上菜}virtual ~Meal() = default;private:void boilWater() {                // 步骤 1:烧水,所有餐食共享的步骤std::cout << "Boiling water\n";}virtual void cook() = 0;          // 步骤 2:烹饪,子类必须实现virtual void serve() = 0;         // 步骤 3:上菜,子类必须实现
};// 具体子类:制作汤
class Soup : public Meal {
private:void cook() override {            // 实现具体的烹饪步骤std::cout << "Cooking soup\n";}void serve() override {           // 实现具体的上菜步骤std::cout << "Serving soup\n";}
};// 具体子类:制作沙拉
class Salad : public Meal {
private:void cook() override {            // 实现具体的烹饪步骤std::cout << "Preparing salad\n";}void serve() override {           // 实现具体的上菜步骤std::cout << "Serving salad\n";}
};int main() {std::cout << "Preparing meal of Soup:\n";Meal* meal = new Soup();meal->prepareMeal();              // 调用模板方法,自动完成一系列步骤delete meal;std::cout << "\nPreparing meal of Salad:\n";meal = new Salad();meal->prepareMeal();              // 调用模板方法,自动完成一系列步骤delete meal;return 0;
}

六:相关模式

      模板方法模式和策略模式的使用场景非常相似。两者都允许提供算法的不同变体。模板方法模式通过子类化在类级别上实现,而策略模式通过对象组合在对象级别上实现。策略模式将不同的策略作为对象提供,因此可以在运行时交换策略。模板方法模式倒置了控制流,遵循好莱坞原则:“别找我们,我们来找你”。策略模式通常是一个黑盒,它允许你在不需要了解其细节的情况下替换策略。

七:优缺点

 优点

  • 通过创建新的子类,新的算法变体易于实现。
  • 算法中的共同步骤可以直接在接口类中实现。

缺点

  • 即使是算法的小变体,也需要创建一个新的类,这可能导致创建许多小类。
  • 算法框架是固定的,无法更改;不过,你可以通过将框架函数设为虚函数来克服这一限制。

参考:

1. https://zh.wikipedia.org/wiki/%E6%A8%A1%E6%9D%BF%E6%96%B9%E6%B3%95

2. The Template Method – MC++ BLOG

相关文章:

C++设计模式 - 模板模式

一&#xff1a;概述 模板方法&#xff08;Template Method&#xff09;是一种行为型设计模式。它定义了一个算法的基本框架&#xff0c;并且可能是《设计模式&#xff1a;可复用面向对象软件的基础》一书中最常用的设计模式之一。 模板方法的核心思想很容易理解。我们需要定义一…...

mysql查缺补漏

好文推荐&#xff1a; 【数据库】快速理解脏读、不可重复读、幻读-CSDN博客 再探幻读&#xff01;什么是幻读?为什么会产生幻读&#xff0c;MySQL中是怎么解决幻读的&#xff1f;-CSDN博客 引擎 mysql默认引擎&#xff1a;innodb 1.支持行锁 2.支持事务 3.支持外键 索引…...

跨越边界,大模型如何助推科技与社会的完美结合?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 概述 2024年&#xff0c;大模型技术已成为人工智能领域的焦点。这不仅仅是一项技术进步&#xff0c;更是一次可能深刻影响社会发展方方面面的变革。大模型的交叉能否推动技术与社会的真正融合&#xff1f;2025年…...

哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测

哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测 目录 哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测效果一览基本介绍程序设计参考资料 效果一览…...

前端【技术方案】浏览器兼容问题(含解决方案、CSS Hacks、条件注释、特性检测、Polyfill 等)

浏览器兼容性测试工具 https://www.browserstack.com/ HTML 兼容处理 问题1 - 不支持 HTML5 新标签 旧版浏览器&#xff08;主要是 IE8 及以下&#xff09;不支持 HTML5 新标签&#xff08;如 <header>、<nav>、<article> 等&#xff09; 解决方案 引入 H…...

荣耀手机Magic3系列、Magic4系列、Magic5系列、Magic6系列、Magic7系列详情对比以及最新二手价格预测

目录 荣耀Magic系列手机详细对比 最新二手价格预测 性价比分析 总结 以下是荣耀Magic系列手机的详细对比以及最新二手价格预测&#xff1a; 荣耀Magic系列手机详细对比 特性荣耀Magic3系列荣耀Magic4系列荣耀Magic5系列荣耀Magic6系列荣耀Magic7系列处理器骁龙888&#x…...

后盾人JS -- 模块化开发

开发模块管理引擎 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…...

CNN卷积神经网络多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;CNN卷积神经网络多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) 标题&#xff1a;CNN卷积神经网络多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1 研究背景及意义 随着全球能源危机的加剧和环保意识的提升&#xff…...

深入 JVM 虚拟机:字符串常量池演变与 intern() 方法工作原理解析

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 📝 如有错误敬请纠正! 前言 在 Java 开发中,字符串常量池(String Constant…...

单向/双向,单层/多层RNN输入输出维度问题

单向/双向&#xff0c;单层/多层RNN输入输出维度问题 RNN单层单向RNNRnn CellRnn 双层单向RNN单层双向RNN双层双向RNN RNN 单层单向RNN Rnn Cell 循环神经网络最原始的Simple RNN实现如下图所示: 下面写出单个时间步对应的Rnn Cell计算公式: 如果用矩阵运算视角来看待的话&…...

chromium-mojo

https://chromium.googlesource.com/chromium/src//refs/heads/main/mojo/README.md 相关类&#xff1a;https://zhuanlan.zhihu.com/p/426069459 Core:https://source.chromium.org/chromium/chromium/src//main:mojo/core/README.md;bpv1;bpt0 embedder:https://source.chr…...

ZooKeeper 的典型应用场景:从概念到实践

引言 在分布式系统的生态中&#xff0c;ZooKeeper 作为一个协调服务框架&#xff0c;扮演着至关重要的角色。它的设计目的是提供一个简单高效的解决方案来处理分布式系统中常见的协调问题。本文将详细探讨 ZooKeeper 的典型应用场景&#xff0c;包括但不限于配置管理、命名服务…...

缓存组件<keep-alive>

缓存组件<keep-alive> 1.组件作用 组件, 默认会缓存内部的所有组件实例&#xff0c;当组件需要缓存时首先考虑使用此组件。 2.使用场景 场景1&#xff1a;tab切换时&#xff0c;对应的组件保持原状态&#xff0c;使用keep-alive组件 使用&#xff1a;KeepAlive | Vu…...

YouBIP 项目

技术方案 难点 成效 项目背景 库存管理涉及大量数据&#xff0c;如何在前端实现高效的数据展示和交互是一个挑战。库存管理系统需要处理大量的入库、出库、盘点等操作&#xff0c;尤其是在大企业或多仓库场景下&#xff0c;高并发操作可能导致数据库锁争用、响应延迟等问题。…...

react概览webpack基础

react概览 课程介绍 webpack 构建依赖图->bundle 首屏渲染&#xff1a; 减少白屏等待时间 数据、结构、样式都返回。需要服务器的支持 性能优化 ***webpack干的事情 模块化开发 优势&#xff1a; 多人团队协作开发 可复用 单例&#xff1a;全局冲突 闭包 模块导入的顺序 req…...

DeepSeek 助力 Vue 开发:打造丝滑的步骤条

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

STM32的HAL库开发---高级定时器---互补输出带死区实验

一、互补输出简介 互补输出&#xff1a;OCx输出高电平&#xff0c;则互补通道OCxN输出低电平。OCx输出低电平&#xff0c;则互补通道OCxN输出高电平。 带死区控制的互补输出&#xff1a;OCx输出高电平时&#xff0c;则互补通道OCxN过一会再输出输出低电平。这个时间里输出的电…...

Vue07

一、Vuex 概述 目标&#xff1a;明确Vuex是什么&#xff0c;应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购物车数…...

【CXX-Qt】2 CXX-Qt #[cxx_qt::bridge] 宏指南

#[cxx_qt::bridge] 宏是用于在 Rust 中创建一个模块&#xff0c;该模块能够桥接 Rust 和 Qt&#xff08;通过 C&#xff09;之间的交互。它允许你将 Rust 类型暴露给 Qt 作为 QObject、Q_SIGNAL、Q_PROPERTY 等&#xff0c;同时也能够将 Qt 的特性和类型绑定到 Rust 中&#xf…...

鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.

鸿蒙项目接入支付宝后&#xff0c;运行提示error: install parse native so failed. 该问题可能由于设备支持的 Abi 类型与 C 工程中的不匹配导致. 官网error: install parse native so failed.错误解决办法 根据官网提示在模块build-profile.json5中添加“x86_64”依然报错 问…...

局域网使用Ollama(Linux)

解决局域网无法连接Ollama服务的问题 在搭建和使用Ollama服务的过程中&#xff0c;可能会遇到局域网内无法连接的情况。经过排查发现&#xff0c;若开启了代理软件&#xff0c;尤其是Hiddify&#xff0c;会导致此问题。这一发现耗费了我数小时的排查时间&#xff0c;希望能给大…...

Deepseek系列从v3到R易背面经版

deepseek v3 base要点 MTP : Multi-Token Prediction 训练时&#xff1a; 1. 把前一个block中input tokens经过embedding layer和transformer block的输出&#xff0c;进入output head之前的内容记为h&#xff0c;与下一个block的input tokens经过embedding layer输出的内容都…...

Redis深入学习

目录 Redis是什么&#xff1f; Redis使用场景 Redis线程模型 Redis执行命令是单线程的为什么还这么快&#xff1f; Redis持久化 Redis 事务 Key 过期策略 Redis 和 mysql 如何保证数据一致&#xff1f; 缓存穿透 缓存击穿 缓存雪崩 Redis是什么&#xff1f; redis是一…...

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题

前言 在这篇博客中&#xff0c;我们将通过模拟的方法来解决三道经典的算法题&#xff1a;回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力&#xff0c;还挑战了我们对日期处理和数学推理的理解。通过模拟算法&#xff0c;我们能够深入探索每个问题的核心…...

在Uniapp中使用阿里云OSS插件实现文件上传

在开发小程序时&#xff0c;文件上传是一个常见的需求。阿里云OSS&#xff08;Object Storage Service&#xff09;是一个强大的云存储服务&#xff0c;可以帮助我们高效地存储和管理文件。本文将介绍如何在Uniapp小程序中使用阿里云OSS插件实现文件上传功能。 1. 准备工作 首…...

9 数据流图

9 数据流图 9.1数据平衡原则 子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。 9.2解题技巧 实件名 存储名 加工名 数据流...

IDEA查看项目依赖包及其版本

一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...

【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现

目录 1. 用队列实现栈 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 用栈实现队列 2.1 题目链接及描述 2.2 解题思路 2.3 程序 1. 用队列实现栈 1.1 题目链接及描述 1. 题目链接 &#xff1a; 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描…...

SAP-ABAP:ROLLBACK WORK使用详解

在SAP ABAP 中&#xff0c;ROLLBACK WORK 语句用于回滚当前事务&#xff08;LUW&#xff0c;Logical Unit of Work&#xff09;&#xff0c;撤销自上次提交或回滚以来的所有数据库更改。它通常与 COMMIT WORK 配合使用&#xff0c;确保数据一致性。 关键点&#xff1a; 回滚作…...

DeepSeek R1 Distill Llama 70B(免费版)API使用详解

DeepSeek R1 Distill Llama 70B&#xff08;免费版&#xff09;API使用详解 在人工智能领域&#xff0c;随着技术的不断进步&#xff0c;各种新的模型和应用如雨后春笋般涌现。今天&#xff0c;我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…...