(三)行为模式:11、模板模式(Template Pattern)(C++示例)
目录
1、模板模式含义
2、模板模式的UML图学习
3、模板模式的应用场景
4、模板模式的优缺点
5、C++实现的实例
1、模板模式含义
模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将某些步骤的具体实现延迟到子类中。
模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,从而实现代码复用和扩展性。
2、模板模式的UML图学习

- 抽象基类(AblstractClass):负责规定好接口,让子类实现接口,并定义一个模板方法。模板方法是算法骨架,包含了调用基本操作的步骤。
- 具体实现子类(ConcreteClass):实现抽象基类的抽象接口,即实现模板方法中的基本操作。
3、模板模式的应用场景
(1)存在一组相似的操作:当有一组操作拥有相同的算法结构,但某些步骤的实现细节各不相同时,可以使用模板模式来定义这些操作的通用部分,并将变化的部分留给子类去实现。
(2)需要代码复用和扩展性:模板模式通过定义算法骨架和延迟某些步骤的实现,使得代码更加灵活和可扩展。
4、模板模式的优缺点
(1)优点:
- 封装了不变部分,扩展了可变部分:模板模式将算法的不变部分封装在抽象基类中,而将可变部分延迟到子类中实现,从而实现了代码的复用和扩展。
- 提高了代码的可维护性:由于算法骨架在抽象基类中定义,因此当算法结构发生变化时,只需要修改抽象基类即可,而不需要修改每个具体实现子类。
(2)缺点
- 增加了系统的复杂性:模板模式需要定义抽象基类和具体实现子类,以及它们之间的继承关系,这可能会增加系统的复杂性。
- 可能导致子类过多:如果算法中有多个可变步骤,那么可能需要定义多个具体实现子类来覆盖这些步骤,从而导致子类数量过多。
5、C++实现的实例
以下是一个使用C++实现的模板模式示例,该示例模拟了一个咖啡冲泡过程,其中包含了冲泡咖啡的算法骨架和不同的冲泡步骤实现。
#include <iostream> // 抽象基类,定义模板方法和基本操作
class CoffeeMaker {
public: virtual ~CoffeeMaker() {} // 模板方法:冲泡咖啡的步骤 void brewCoffee() { boilWater(); brew(); pourInCup(); if (customerWantsCondiments()) { addCondiments(); } } protected: // 基本操作,留给子类实现 virtual void brew() = 0; virtual void addCondiments() = 0; // 可能不需要子类重写的辅助方法 void boilWater() { std::cout << "Boiling water" << std::endl; } void pourInCup() { std::cout << "Pouring into cup" << std::endl; } // 可能需要子类决定的策略方法 virtual bool customerWantsCondiments() { return true; }
}; // 具体子类:黑咖啡
class BlackCoffee : public CoffeeMaker {
protected: void brew() override { std::cout << "Brewing black coffee" << std::endl; } void addCondiments() override { // 黑咖啡不加调料 }
}; // 具体子类:加糖加奶咖啡
class SugarMilkCoffee : public CoffeeMaker {
protected: void brew() override { std::cout << "Brewing coffee with sugar and milk" << std::endl; } void addCondiments() override { std::cout << "Adding sugar and milk" << std::endl; } bool customerWantsCondiments() override { return true; // 假设加糖加奶咖啡总是需要加调料 }
}; int main() { CoffeeMaker* maker = new BlackCoffee(); maker->brewCoffee(); delete maker; std::cout << "\n"; maker = new SugarMilkCoffee(); maker->brewCoffee(); delete maker; return 0;
}
在这个示例中,CoffeeMaker类是抽象基类,它定义了冲泡咖啡的基本步骤作为模板方法(brewCoffee),并声明了两个纯虚函数brew和addCondiments作为基本操作,让子类去实现。通过这种方式,我们可以复用通用的冲泡流程,同时允许子类灵活地改变某些步骤,符合模板方法模式的设计理念。
相关文章:
(三)行为模式:11、模板模式(Template Pattern)(C++示例)
目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将某些步骤…...
贝叶斯中的充分统计量
内容来源 贝叶斯统计(第二版)中国统计出版社 前两篇笔记简述经典统计中的充分统计量和判断充分统计量的 N e y m a n Neyman Neyman 因子分解定理 而在贝叶斯统计中,充分统计量也有一个充要条件 定理兼定义 设 x ( x 1 , x 2 , ⋯ , x …...
012:ArcGIS Server 10.2安装与站点创建教程
摘要:本文详细介绍地理信息系统服务器软件ArcGIS Server 10.2的安装与站点创建流程。 一、软件介绍 ArcGIS Server 10.2是Esri公司开发的一款强大的地理信息系统(GIS)服务器软件。它支持发布和共享地图、地理数据处理服务及空间分析功能&…...
xlive.dll错误的详细解决办法步骤教程,xlive.dll基本状况介绍
在计算机的众多文件中,“xlive.dll”扮演着独特而重要的角色。所以当你的电脑丢失了xlive.dll文件时,会倒是电脑不能正常运行,那么出现这样的问题有什么办法可以将丢失的xlive.dll进行修复呢?今天这篇文章将和大家聊聊xlive.dll错…...
通俗易懂的餐厅例子来讲解JVM
餐厅版本 JVM(Java虚拟机)可以想象成一个虚拟的计算机,它能够运行Java程序。为了让你更容易理解,我们可以用一个餐厅的比喻来解释JVM: 菜单(Java源代码): 想象一下,Java…...
Python从入门到高手7.3节-列表的常用操作方法
目录 7.3.1 列表常用操作方法 7.3.2 列表的添加 7.3.3 列表的查找 7.3.4 列表的修改 7.3.5 列表的删除 7.3.6 与列表有关的其它操作方法 7.3.7 与10月说再见 7.3.1 列表常用操作方法 列表类型是一种抽象数据类型,抽象数据类型定义了数据类型的操作方法。在本…...
Prompt提示词设计:如何让你的AI对话更智能?
Prompt设计:如何让你的AI对话更智能? 在人工智能的世界里,Prompt(提示词)就像是一把钥匙,能够解锁AI的潜力,让它更好地理解和响应你的需求。今天,我们就来聊聊如何通过精心设计的Pr…...
2024-10月的“冷饭热炒“--解读GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路
GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路 1.最新技术事件浅析三、思考和方案设计工具代码部分1.提示词2.工具类API定义,这里主要看computer tool就够了 总结 本文会总结概括这一应用的利弊,然后给出分析和工具代…...
Me 攒的GPT修改论文提示词
没有会员的GPT They demonstrated that QGAN exhibits an exponential advantage over classical methods when using data consisting of samples of measurements made on high-dimensional spaces. 作为related work 时态对吗? 有需要修改的吗?你可…...
关于在vue2中接受后端返回的二进制流并进行本地下载
后端接口返回: 前端需要在两个地方写代码: 1.封装接口处,responseType: blob 2.接收相应处 download() {if (this.selectionList.length 0) {this.$message.error("请选择要导出的数据!");} else {examineruleExport…...
[BUG]warn(f“Failed to load image Python extension: {e}“)的解决办法
在使用LlaMa-Factory工具包时,安装好环境后,输入llamafactory-cli env查看llama-factory的版本等信息时,bash提醒: /home/ubuntu/anaconda3/envs/Llama-Factory/lib/python3.10/site-packages/torchvision/io/image.py:13: UserW…...
配置MUX VLAN 的实验配置
概念和工作原理: MUX VLAN(Multiplex VLAN)是一种高级的VLAN技术,它通过在交换机上实现二层流量隔离和灵活的网络资源控制,提供了一种更为细致的网络管理方式。 概念与工作原理 基本概念: MUX VLAN通过定义主VLAN&am…...
高考相关 APP 案例分享
文章首发于https://qdgithub.com/article/2032 一、核心内容 (一)高考相关 APP 案例 圈友朱康分享高考相关的 APP。提到猿题库,其主要功能有练习册和猿辅导,都是收费的。猿题库出题给学生练习,将易错的总结起来出练习…...
AI的出现对计算机相关类型的博客或论坛的影响
最近越来越感觉到,AI的出现对计算机相关类型的博客是一种从寄生再到蚕食的过程。 在AI没出现之前,大家遇到问题,那一般都是去百度搜索,然后就能找到大神前辈的解答思路,这些解答思路基本都是写在博客或者论坛里的&…...
[LeetCode] 784. 字母大小写全排序
题目描述: 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。 示例 1: 输入:s "a1b2" 输出࿱…...
大数据Azkaban(二):Azkaban简单介绍
文章目录 Azkaban简单介绍 一、Azkaban特点 二、Azkaban组成结构 三、Azkaban部署模式 1、solo-server ode(独立服务器模式) 2、two server mode(双服务器模式) 3、distributed multiple-executor mode(分布式多…...
Vue3_开启全局websocket
1、封装websocket 新建文件夹"socket.ts",路径:"/utils/socket" export default (onMessage: Function) > {let socketUrl ws://171.29.8.218:8080/ems/ws/screen //socket请求地址let socket: WebSocketlet lockReconnect f…...
PTA 社交集群
当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。 输入格式 输入在第一行给出一个正整数 N(≤1000&…...
USB Type-C 受电端取电快充协议芯片,支持PD+QC+FCP+SCP+AFC快充协议
前言 随着科技的飞速发展,电子设备对于快速充电的需求日益增加。为了满足这一需求,市场上涌现出了众多快充技术和产品。其中,XSP08Q诱骗取电芯片以其卓越的性能和广泛的应用场景,成为了快充领域的一颗璀璨明星。本文将对XSP08Q P…...
C++ 模板专题 - 参数约束
一:概述: 除了使用SFINAE对模板参数进行约束之外,还可以使用概念(Concepts)来对模板参数进行约束,确保传入的类似满足特定条件。概念(Concepts)是C20中引入的,概念是用于…...
SDMatte与版本控制:使用Git管理模型权重、训练脚本与实验数据
SDMatte与版本控制:使用Git管理模型权重、训练脚本与实验数据 1. 为什么机器学习项目需要版本控制 在SDMatte这类图像处理模型的开发过程中,我们经常遇到这样的困扰:上周训练的那个效果最好的模型权重文件找不到了;修改了训练脚…...
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾为游戏不支持你的手柄…...
NPU加速!DeepSeek-V3大模型极速体验攻略
NPU加速!DeepSeek-V3大模型极速体验攻略 【免费下载链接】DeepSeek-V3-0324-w4a8-mtp-QuaRot 项目地址: https://ai.gitcode.com/Eco-Tech/DeepSeek-V3-0324-w4a8-mtp-QuaRot 导语:DeepSeek-V3系列大模型推出NPU硬件加速版本,标志着大…...
实战应用:从零到一,使用快马构建资料更新内容管理系统的完整案例
实战应用:从零到一,使用快马构建资料更新内容管理系统的完整案例 最近接手了一个资料大全的版本更新管理需求,需要搭建一个简单高效的内容管理系统。经过一番摸索,我发现用InsCode(快马)平台可以快速实现这个功能,整个…...
微信毕业设计基于微信小程序的易物小店交换系统
前言 Spring Boot 易物小店交换系统是一个基于 Web 的应用程序,利用 Spring Boot 框架构建,主要用于帮助用户实现物品交换的功能。该系统为用户提供了一个便捷、安全、高效的平台,让他们能够轻松地发布自己想要交换的物品信息,寻找…...
SpringBoot集成gRPC踩坑指南:从.proto文件到服务调用的完整流程
SpringBoot与gRPC深度整合实战:从协议定义到生产级部署 在微服务架构盛行的今天,跨语言服务调用已成为刚需。作为Google开源的RPC框架,gRPC凭借其基于HTTP/2的高效传输和Protocol Buffers的紧凑序列化,在分布式系统中展现出独特优…...
SillyTavern角色系统深度解析:从基础配置到高级应用
SillyTavern角色系统深度解析:从基础配置到高级应用 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 引言:为什么角色系统是SillyTavern的核心竞争力? 在…...
矩阵LED与矩阵按键的扫描驱动原理及实现
1. 矩阵LED与矩阵按键的硬件结构解析 第一次接触矩阵LED和矩阵按键时,我完全被那些交叉的线路搞晕了。后来才发现,它们的本质就是行和列的交叉网络。想象一下围棋棋盘,横线是行,竖线是列,每个交叉点就是一颗棋子——在…...
Spring Cloud Hystrix 详细示-元一软件
Hystrix 是 Spring Cloud 中实现服务熔断、降级、隔离的核心组件,用于解决微服务架构中的雪崩效应,核心是快速失败、优雅降级、自动恢复。以下从环境搭建、基础使用、高级配置、Feign 整合、监控5 个维度提供完整示例。一、项目环境准备1. 依赖引入&…...
MATLAB实战:用LQR控制算法让二级倒立摆稳如老狗(附完整代码)
MATLAB实战:用LQR控制算法驯服二级倒立摆 记得第一次在实验室见到二级倒立摆时,那两根倔强的摆杆就像喝醉的水手,稍有不慎就东倒西歪。当时我就想,要是能像马戏团驯兽师那样让它们乖乖立正该多好。今天,我们就用MATLAB…...
