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

C++常用23种设计模式总结(三)------装饰模式

往期回顾
C++常用23种设计模式总结(一)------单例模式
C++常用23种设计模式总结(二)------观察者模式

什么是装饰模式

装饰模式是一种结构型设计模式,它允许你在运行时为对象动态添加新的行为。该模式通过将对象放入包装器中来实现这一点,这个包装器会实现与被包装对象相同的接口,并且会将所有方法的调用委派给被包装对象。同时,包装器还可以定义一些额外的行为,例如添加新的方法或修改现有方法的行为。

装饰模式的主要优点是它允许你在不修改现有代码的情况下扩展对象的功能。这使得代码更加灵活和可维护,因为你可以通过添加新的装饰器来实现新的功能,而不必修改现有的代码。此外,装饰模式还遵循开闭原则,因为它允许你在不修改现有代码的情况下添加新的功能。

然而,装饰模式也有一些缺点。首先,由于每个装饰器都需要实现与被包装对象相同的接口,因此可能会导致类的数量增加。此外,由于装饰器可以嵌套,因此可能会导致代码变得复杂和难以理解。最后,装饰模式可能会导致性能下降,因为每个方法调用都需要经过多个装饰器的处理。

参考代码

#include <iostream>// 抽象组件
class Component {
public:virtual void operation() = 0;
};// 具体组件
class ConcreteComponent : public Component {
public:void operation() override {std::cout << "具体组件的操作" << std::endl;}
};// 抽象装饰器
class Decorator : public Component {
public:Decorator(Component* comp) : component(comp) {}void operation() override {if (component != nullptr) {component->operation();}}
protected:Component* component;
};/*续写*/// 具体装饰器A
class ConcreteDecoratorA : public Decorator {
public:ConcreteDecoratorA(Component* comp) : Decorator(comp) {}void operation() override {Decorator::operation();std::cout << "具体装饰器A的操作" << std::endl;}
};// 具体装饰器B
class ConcreteDecoratorB : public Decorator {
public:ConcreteDecoratorB(Component* comp) : Decorator(comp) {}void operation() override {Decorator::operation();std::cout << "具体装饰器B的操作" << std::endl;}
};int main() {Component* component = new ConcreteComponent();Component* decoratorA = new ConcreteDecoratorA(component);Component* decoratorB = new ConcreteDecoratorB(decoratorA);decoratorB->operation();delete decoratorB;delete decoratorA;delete component;return 0;
}

运行结果

具体组件的操作
具体装饰器A的操作
具体装饰器B的操作

相关文章:

C++常用23种设计模式总结(三)------装饰模式

往期回顾 C常用23种设计模式总结(一)------单例模式 C常用23种设计模式总结(二)------观察者模式 什么是装饰模式 装饰模式是一种结构型设计模式&#xff0c;它允许你在运行时为对象动态添加新的行为。该模式通过将对象放入包装器中来实现这一点&#xff0c;这个包装器会实现与…...

选择O型圈时要考虑哪些因素?

为您的应用选择正确的O型圈对于确保适当的密封和较佳性能至关重要。O型圈可用的材料和尺寸多种多样&#xff0c;做出正确的选择可能需要知道一些重要的知识点。在本文中&#xff0c;我们将讨论选择O型圈时需要考虑的一些关键因素。 1、材料兼容性&#xff1a;先要考虑的因素是…...

安全管理中心技术测评要求项

1.系统管理-通过系统管理员进行系统管理操作 1-0/2-2/3-2/4-2 a&#xff09;对系统管理员进行身份鉴别&#xff0c;只允许其通过特定的命令或操作界面进行系统管理操作&#xff0c;并对这些操作进行审计 b&#xff09;通过系统管理员对系统的资源和运行进行配置、控制和管理&am…...

Hibernate(Spring Data)抓取策略

文章目录 示例代码放到最后&#xff0c;使用的是Springboot 项目1. 简介2. Hibernate抓取策略分类2.1 即时加载&#xff08;Eager Loading&#xff09;2.2 延迟加载&#xff08;Lazy Loading&#xff09;2.3 子查询加载&#xff08;Subselect Loading&#xff09;2.4 基于批处理…...

【高阶数据结构】map和set的介绍和使用 {关联式容器;键值对;map和set;multimap和multiset;OJ练习}

map和set的介绍和使用 一、关联式容器 关联式容器和序列式容器是C STL中的两种不同类型的容器。 关联式容器是基于键值对的容器&#xff0c;其中每个元素都有一个唯一的键值&#xff0c;可以通过键值来访问元素。关联式容器包括set、multiset、map和multimap。 序列式容器是…...

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的&#xff0c;因为很多的好朋友也比较关注这方面的内容&#xff0c;所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给大家做个简单讲解&#xff0c;我这里只是抛砖引玉&#xff0c…...

Redis进阶 - JVM进程缓存

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis进阶 - JVM进程缓存 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html 传统缓存的问题 传统的缓存策略一般是请求到达 Tomcat 后&#xff0c;先查询 Redis &…...

SD-WAN带您告别高成本、单一功能和安全性差

现今&#xff0c;随着企业规模不断扩大和分散办公越来越普遍&#xff0c;企业对于网络的需求也变得越来越高。然而&#xff0c;传统的组网方式面临着很多的问题&#xff0c;比如&#xff1a;成本高、功能单一、安全性差等问题。 传统组网方式有哪些&#xff1f; 传统的组网方式…...

面试必备:揭秘ArrayList和LinkedList,区别、优缺点与使用场景

大家好&#xff0c;我是你们的小米&#xff01;今天我要跟大家聊一个在面试中经常被问到的热门话题——ArrayList和LinkedList的区别、优缺点以及它们的使用场景。作为程序员&#xff0c;掌握这些知识点不仅可以在面试中脱颖而出&#xff0c;还能帮助我们更好地在项目中选择合适…...

【局部活动轮廓】使用水平集方法实现局部活动轮廓方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Git 同步远程新的同名分支

背景 因为远程分支的提交记录过多&#xff0c;导致本地的commit内容过大&#xff0c;会产生一些问题&#xff1a; 第一次拉取时间较长占用本地和远程的存储 原因 因为项目已有一些年头&#xff0c;若是每次文件提交比较大&#xff0c;那么占用空间就更大 解决方案 该方案…...

PingCode DevOps 团队:企业CICD流水线可能会遇到的问题及解法

CICD 流水线是指一系列自动化的构建、测试和部署步骤&#xff0c;用于将应用程序从开发到生产环境的过程。在 CICD 流水线中&#xff0c;每个步骤都是自动化的&#xff0c;并且在完成后会触发下一个步骤的执行。 CICD 的价值 CICD 流水线可以帮助团队更快地交付产品&#xff…...

【LeetCode题目详解】第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 (day38补)

本文章代码以c为例&#xff01; 一、力扣第509题&#xff1a;斐波那契数 题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a…...

图像处理 信号处理板 设计原理图:367-基于zynq XC7Z100 FMC接口通用计算平台

基于zynq XC7Z100 FMC接口通用计算平台 一、板卡概述 板卡由SoC XC7Z100-2FFG900I芯片来完成卡主控及数字信号处理&#xff0c;XC7Z100内部集成了两个ARM Cortex-A9核和一个kintex 7的FPGA&#xff0c;通过PL端FPGA扩展FMC、光纤、IO等接口&#xff0c;PS端ARM扩展网络、USB、R…...

PHP中header()的七种用法

我们在实际开发中经常使用header()实现一些功能&#xff0c;这篇文章介绍关于header()的7中用法&#xff0c;需要的伙伴的开参考一下。 PHP header()的7中用法&#xff1a; 1、跳转页面 可以使用header()实现跳转页面功能。 header(Location:.$url); // $url 跳转页面的地址…...

臻图信息以数字孪生技术推动智慧小区数字化建设

伴随着智慧城市建设进程的加速发展&#xff0c;加速传统小区的管理与服务向智能化升级转型。运用智慧化的管理和服务&#xff0c;利用信息技术和物联网等技术手段&#xff0c;将传统的居住区域与智能设备相结合&#xff0c;实现楼宇、社区设施、服务管理的数字化、网络化、智能…...

15.CSS发光按钮的悬停特效

效果 源码 <!DOCTYPE html> <html> <head><title>CSS Modern Button</title><link rel="stylesheet" type="text/css" href="style.css"> </head> <body><a href="#" style=&quo…...

MyBatis —— 动态SQL和缓存

前言 在上一篇文章中荔枝梳理了一些特殊的SQL查询和一对多、多对一的映射关系&#xff0c;而在这篇文章中荔枝将会梳理有关MyBatis动态SQL和MyBatis缓存的相关知识&#xff0c;同时也稍微了解了有关MyBatis中借助MAVEN中的插件管理来实现逆向工程。希望对需要的小伙伴有帮助哈哈…...

恒流电路的三种设计方案

作为硬件研发工程师相信对恒流电路不会陌生&#xff0c;本文介绍下三种恒流电路的原理图。 三极管恒流电路 三极管恒流电路 三极管的恒流电路&#xff0c;主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性&#xff1b;当Q2三极管导通&#xff0c;Q1三极管基级电压被拉低而…...

QT基础 关于QT延迟

目录 QT提供延时 1.自定义延时 2.使用QElapsedTimer 3.使用事件循环 4.跨平台延时 QT提供延时 这里提供四种方法&#xff1a; 1、多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。 Sleep不会释放对象锁&#x…...

开关电源负反馈环路设计:从传递函数到稳定性实战

1. 项目概述&#xff1a;从“开环”到“闭环”的认知跃迁在电源设计&#xff0c;尤其是开关电源设计的领域里&#xff0c;“负反馈”是一个既基础又核心的概念。很多工程师在入门时&#xff0c;可能会把注意力集中在功率拓扑的选择、电感电容的计算、MOSFET的选型上&#xff0c…...

HTTPS一文通

https 的出现&#xff0c;为解决网络加密通信提供了完美的解决方案。现在得到了非常普遍的运用。但 https 的原理和部署方式还存在一些较迷惑的点。 一、基础数学知识 在普通的http通讯过程中&#xff0c;前端浏览器和服务器之间传递的都是明文&#xff0c;这样敏感信息就容易被…...

从单机到团队协作:手把手教你用SVN在Windows上搭建个人小型项目版本库(含汉化与日常使用图解)

从单机到团队协作&#xff1a;Windows环境下SVN轻量化部署与实战指南 在个人开发和小型团队协作中&#xff0c;版本控制是保证代码安全和团队高效协作的基石。对于Windows平台的开发者而言&#xff0c;SVN&#xff08;Subversion&#xff09;以其简单可靠的特点&#xff0c;成为…...

【Midjourney印象派风格创作指南】:20年AI视觉专家亲授5大核心参数调优法,3步生成莫奈级画作

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;印象派美学与AI生成的底层耦合逻辑 印象派绘画摒弃精确轮廓与固有色&#xff0c;转而捕捉瞬时的光色颤动、视觉暂留与感知模糊性——这种对“未完成感”“概率性呈现”和“感知优先于表征”的推崇&#xff0c;…...

Adobe-GenP:创意工作者的智能许可证管理解决方案

Adobe-GenP&#xff1a;创意工作者的智能许可证管理解决方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 在数字创意领域&#xff0c;Adobe Creative Cloud系列软…...

CANN/pypto PASS组件错误码说明

PASS 组件错误码说明文档 【免费下载链接】pypto PyPTO&#xff08;发音: pai p-t-o&#xff09;&#xff1a;Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 范围&#xff1a;F40000-F44002本文档说明 PASS 组件的错误码定义、场…...

数采网关的应用与特点

摘要在工业自动化、智能制造和物联网&#xff08;IoT&#xff09;快速发展的背景下&#xff0c;数据采集网关&#xff08;数采网关&#xff09;作为连接现场设备与上层管理系统的关键枢纽&#xff0c;发挥着至关重要的作用。它能够实现工业设备数据的实时采集、协议转换、边缘计…...

ComfyUI全面掌握-知识点详解——ComfyUI 开发与扩展基础(开发指南+环境搭建)

本文为「ComfyUI 全面掌握」系列第 23 篇&#xff0c;是高阶进阶章节的第一篇知识点详解博客。作为开发系列的起点&#xff0c;本文将带你系统了解 ComfyUI 社区贡献流程&#xff0c;并手把手搭建完整的自定义节点开发环境&#xff0c;为后续的节点开发与发布奠定坚实的技术基础…...

Sunshine自托管游戏串流终极指南:打造跨平台家庭游戏云的完整解决方案

Sunshine自托管游戏串流终极指南&#xff1a;打造跨平台家庭游戏云的完整解决方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想象一下这样的场景&#xff1a;您坐在客厅沙发上…...

网络安全实战工具链:从信息收集到漏洞修复的工程化闭环

1. 这不是“黑客速成班”&#xff0c;而是安全工程师真实工作流的切片很多人看到“挖漏洞”三个字&#xff0c;第一反应是黑进某个网站、弹出个红色命令行、屏幕上飞速滚动着看不懂的字符——然后“啪”一声&#xff0c;系统瘫痪。现实里我干了八年渗透测试和红队支撑&#xff…...