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

装饰器模式的C++实现示例

核心思想

装饰器设计模式是一种结构型设计模式,它允许动态地为对象添加额外的行为或职责,而无需修改其原始类。装饰器模式通过创建一个装饰器类来包装原始对象,并在保持原始对象接口一致性的前提下,扩展其功能。

装饰器模式的核心在于:
​动态扩展功能:在不改变原始对象的情况下,通过装饰器为其添加新的行为。
​组合优于继承:装饰器模式通过组合的方式扩展功能,避免了继承带来的类层次结构复杂化。

使用场景

​动态添加功能:当需要为对象动态地添加功能,并且这些功能可以组合使用时。
​避免子类膨胀:当使用继承会导致子类数量爆炸时,装饰器模式提供了一种更灵活的替代方案。
​扩展第三方库:当无法修改第三方库的代码,但需要为其添加额外功能时。

优点

​灵活性:可以动态地为对象添加或移除功能。
​遵循开闭原则:无需修改原始类,即可扩展其功能。
​避免继承的缺点:通过组合实现功能扩展,避免了继承带来的类层次结构复杂化。

缺点

​复杂性:装饰器模式会引入大量小类,增加了代码的复杂性。
​调试困难:由于装饰器是层层包装的,调试时可能难以追踪到具体的行为。

示例代码

#include <iostream>
#include <memory>
#include <string>// 抽象组件:定义文本接口
class Text {
public:virtual ~Text() = default;virtual std::string render() const = 0;
};// 具体组件:实现基本的文本
class PlainText : public Text {
private:std::string content;public:explicit PlainText(const std::string& content) : content(content) {}std::string render() const override {return content;}
};// 抽象装饰器:继承自 Text,并包含一个 Text 对象的指针
class TextDecorator : public Text {
protected:std::shared_ptr<Text> text;public:explicit TextDecorator(std::shared_ptr<Text> text) : text(std::move(text)) {}std::string render() const override {return text->render();}
};// 具体装饰器:为文本添加加粗格式
class BoldText : public TextDecorator {
public:explicit BoldText(std::shared_ptr<Text> text) : TextDecorator(std::move(text)) {}std::string render() const override {return "<b>" + text->render() + "</b>";}
};// 具体装饰器:为文本添加斜体格式
class ItalicText : public TextDecorator {
public:explicit ItalicText(std::shared_ptr<Text> text) : TextDecorator(std::move(text)) {}std::string render() const override {return "<i>" + text->render() + "</i>";}
};// 具体装饰器:为文本添加下划线格式
class UnderlineText : public TextDecorator {
public:explicit UnderlineText(std::shared_ptr<Text> text) : TextDecorator(std::move(text)) {}std::string render() const override {return "<u>" + text->render() + "</u>";}
};int main() {// 创建原始文本std::shared_ptr<Text> text = std::make_shared<PlainText>("Hello, World!");std::cout << text->render() << std::endl;// 动态添加装饰器text = std::make_shared<BoldText>(text);std::cout << text->render() << std::endl;text = std::make_shared<ItalicText>(text);std::cout << text->render() << std::endl;text = std::make_shared<UnderlineText>(text);std::cout << text->render() << std::endl;return 0;
}

输出结果

Hello, World!
<b>Hello, World!</b>
<i><b>Hello, World!</b></i>
<u><i><b>Hello, World!</b></i></u>

代码解析

Text 类
抽象组件,定义了文本的接口 render()。
PlainText 类
具体组件,实现了基本的文本渲染。
TextDecorator 类
抽象装饰器,继承自 Text,并包含一个 Text 对象的指针。
提供了默认的 render() 实现,直接调用被装饰对象的 render() 方法。
BoldText、ItalicText、UnderlineText 类
具体装饰器,继承自 TextDecorator,重写了 render() 方法,为文本添加额外的格式。
main 函数
创建了一个原始文本对象 PlainText。
通过装饰器动态地为文本添加加粗、斜体和下划线格式。
最终渲染文本并输出结果。

装饰器模式通过动态地为对象添加额外的行为,提供了一种灵活的功能扩展方式。它避免了继承带来的类层次结构复杂化,同时遵循了开闭原则。在 C++ 中,可以通过组合和继承机制轻松实现装饰器模式。

相关文章:

装饰器模式的C++实现示例

核心思想 装饰器设计模式是一种结构型设计模式&#xff0c;它允许动态地为对象添加额外的行为或职责&#xff0c;而无需修改其原始类。装饰器模式通过创建一个装饰器类来包装原始对象&#xff0c;并在保持原始对象接口一致性的前提下&#xff0c;扩展其功能。 装饰器模式的核…...

Python+DeepSeek:开启AI编程新次元——从自动化到智能创造的实战指南

文章核心价值 技术热点:结合全球最流行的编程语言与国产顶尖AI模型实用场景:覆盖代码开发/数据分析/办公自动化等高频需求流量密码:揭秘大模型在编程中的创造性应用目录结构 环境搭建:5分钟快速接入DeepSeek场景一:AI辅助代码开发(智能补全+调试)场景二:数据分析超级助…...

25.3.12.Linux内核如何和设备树协同工作的?

1.编写设备树 cd arch/riscv/boot/dts/ 再cd到厂商,例如下述内容。 2.编译设备树(dts->dtb)通过dtc命令来转换 3.解析设备树 例如上述内容,都是对设备树的解析。 这里重点说一下内核对设备树的处理吧,因为这个内容是设备树的重点了。 从源代码文件 dts 文件开始...

python中路径操作简介

一、./的基础含义 ​当前目录 ./表示当前工作目录&#xff08;Current Working Directory, CWD&#xff09;&#xff0c;即Python脚本运行时所在的目录。例如&#xff1a; open(./data.txt, r) # 打开当前目录下的data.txt文件 ​作用&#xff1a;避免直接写文件名可能引发的路…...

Flutter 基础组件 Text 详解

目录 1. 引言 2. 基本使用 3. 自定义样式 4. 文本对齐与溢出控制 5. 外边距 5.1 使用 Container 包裹 5.2 使用 Padding 组件 5.3 在 Row/Column 中使用 5.4 动态边距调整 5.5 关键区别说明 5.6 设置 margin 无效 6. 结论 相关推荐 1. 引言 Text 组件是 Flutter 中…...

Torch 模型 model => .onnx => .trt 及利用 TensorTR 在 C++ 下的模型部署教程

一、模型训练环境搭建和模型训练 模型训练环境搭建主要牵扯 Nvidia driver、Cuda、Cudnn、Anaconda、Torch 的安装&#xff0c;相关安装教程可以参考【StarCoder 微调《个人编程助手: 训练你自己的编码助手》】中 5.1 之前的章节。 模型训练的相关知识可以参考 Torch的编程方…...

FreeSWITCH 之 chat

要把 FreeSWITCH 之 chat 完全研究清楚&#xff0c;似乎不容易 发送&#xff0c;路由&#xff0c;接收 跟哪些模块有关 等等 咱一边查资料&#xff0c;一边整理&#xff0c;不着急 先看看 Kamalio 怎么发 MESSAGE loadmodule "uac.so"route[uac_send_message] {…...

如何在Spring Boot中配置和使用MyBatis-Plus

在当今的Java开发中&#xff0c;Spring Boot已经成为了一个非常流行的框架&#xff0c;而MyBatis-Plus则是一个强大的ORM框架&#xff0c;为开发人员提供了更简便的数据库操作方式。很多开发者都在使用Spring Boot和MyBatis-Plus的组合来快速构建高效的应用。今天就来聊聊如何在…...

爱普生可编程晶振SG-8200CJ特性与应用

在高速发展的电子技术领域&#xff0c;时钟源作为电子系统的“心脏”&#xff0c;其性能直接影响设备的稳定性与可靠性。爱普生SG-8200CJ可编程晶振凭借其优秀的频率精度、低抖动性能及广泛的环境适应性&#xff0c;正成为众多领域的得力之选&#xff0c;为各类设备的高效运行与…...

ubuntu中用docker下载opengauss

1.安装docker sudo apt install docker.io2.拉取opengauss镜像 sudo docker pull enmotech/opengauss3.创建容器 sudo docker run --name opengauss --privilegedtrue -d -e GS_PASSWORDEnmo123 enmotech/opengauss:latest3.5.如果容器停止运行&#xff08;比如关机了&#…...

tslib

使用tslib来读取触摸屏的数据&#xff0c;可以得到原始数据&#xff0c;也可以在原始数据的基础上进行一些处理。比如有些触摸屏比较不稳定&#xff0c;跳动比较大&#xff0c;我们可以将跳动比较大的数据给删除掉 plugins里面的每个文件都会被编译成一个动态库&#xff0c;这些…...

MANUS怎么用

&#xff08;1&#xff09;分析方法论我过去说过一个分析模型&#xff1a;供给侧-消费侧。供给侧想做大&#xff0c;得靠生态集成。消费侧想坐大&#xff0c;得靠交互体验。&#xff08;2&#xff09;交互体验我先给大家讲一下计算机产业发展70来年&#xff0c;在交互上的变化。…...

Spring Cloud Alibaba 实战:Sentinel 保障微服务的高可用性与流量防护

1.1 Sentinel 作用 Sentinel 是阿里巴巴开源的一款 流量控制和熔断降级 框架&#xff0c;主要用于&#xff1a; 流量控制&#xff1a;限制 QPS&#xff0c;防止流量暴增导致系统崩溃熔断降级&#xff1a;当某个服务不可用时自动降级&#xff0c;避免故障扩散热点参数限流&…...

大数据技术在土地利用规划中的应用分析

大数据技术在土地利用规划中的应用分析 一、引言 土地利用规划是对一定区域内的土地开发、利用、整治和保护所作出的统筹安排与战略部署,对于实现土地资源的优化配置、保障社会经济的可持续发展具有关键意义。在当今数字化时代,大数据技术凭借其海量数据处理、高效信息挖掘等…...

MoonSharp 文档三

MoonSharp 文档一-CSDN博客 MoonSharp 文档二-CSDN博客 MoonSharp 文档四-CSDN博客 MoonSharp 文档五-CSDN博客 7.Proxy objects&#xff08;代理对象&#xff09; 如何封装你的实现&#xff0c;同时又为脚本提供一个有意义的对象模型 官方文档&#xff1a;MoonSharp 在实际…...

linux和windows之间的复制

第一步 sudo apt-get autoremove open-vm-tools第二步 sudo apt-get update第三步 sudo apt-get install open-vm-tools-desktop按y 第四步 重启虚拟机&#xff0c;终端下输入 rebootLinux下 按“ CtrlShiftC V ”复制粘贴 Windows下按“ Ctrl C V ”复制粘贴...

在资源有限中逆势突围:从抗战智谋到寒门高考的破局智慧

目录 引言 一、历史中的非对称作战&#xff1a;从李牧到八路军的智谋传承 李牧戍边&#xff1a;古代军事博弈中的资源重构 八路军的游击战&#xff1a;现代战争中的智慧延续 二、创业界的逆袭之道&#xff1a;小米与拼多多的资源重构 从MVP到杠杆解 社交裂变与资源错配 …...

Ubuntu 22.04 无法进入图形界面的解决方法

Ubuntu 22.04 无法进入图形界面&#xff0c;只能进入 tty&#xff0c;可能是由于图形界面相关的配置或驱动程序出现了问题。以下是一些常见的解决方法&#xff1a; 1. 检查图形界面服务状态 首先&#xff0c;检查图形界面服务&#xff08;通常是 gdm 或 lightdm&#xff09;的…...

Python中很常用的100个函数整理

Python 内置函数提供了强大的工具&#xff0c;涵盖数据处理、数学运算、迭代控制、类型转换等。本文总结了 100 个常用内置函数&#xff0c;并配备示例代码&#xff0c;提高编程效率。 1. abs() 取绝对值 print(abs(-10)) # 10 2. all() 判断所有元素是否为真 print(all([…...

javascript-es6 (六)

编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用就可以了 就是按照我们分析好了的步骤&#xff0c;按照步骤解决问题 面向对象 面向对象是把事务分解成为一个个对象&…...

大模型微调技术基础(一)

文章目录 GPT与BERT的差异GPT&#xff08;Decoder架构&#xff09;优点缺点 BERT&#xff08;Encoder架构&#xff09;优点缺点 总结 LoRA低参数大模型与全参数小模型表现对比分析LoRA&#xff08;Low-Rank Adaptation&#xff09;技术详解1. LoRA 核心原理2. 应用场景3. 简单代…...

Spring AI 1.0.0 M6新特性MCP

Spring AI 1.0.0 M6新特性MCP 前言一、MCP是什么&#xff1f;&#xff08;Model Context Protocol&#xff09;二、它的发展历程三、核心架构四、MCP Java SDK的核心能力Java MCP实现遵循三层架构&#xff1a;MCP客户端MCP服务器总结MCP 的核心能力总结多种传输选项 搭建服务端…...

【时时三省】(C语言基础)赋值表达式和赋值语句和变量赋初值

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 赋值表达式和赋值语句 在C程序中&#xff0c;赋值语句是用得最多的语句。实际上&#xff0c;C语言的赋值语句属于表达式语句&#xff0c;由一个赋值表达式加一个分号组成。其他一些高级语言…...

Room数据库的使用

一、room的引用导入 1、在app的gradle中引入 plugins {//这个ksp 一定要对应相关的 kotlin 版本&#xff0c;不然会一直报错i的---id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false } 2、在model的gradle中引入 plugins {id("com.g…...

【性能测试入门_01性能测试jmeter基础实操场景详解】

一、应用项目如何部署在服务器上 可以将项目进行打jar包 双击install&#xff0c;控制台就会打印打包的过程 最终打的包&#xff0c;会存放在打印的那个路径下 这个jar包&#xff0c;就是开发人员开发好&#xff0c;直接可以部署的 可以通过命令&#xff0c;在终端直接启动这…...

SpringBoot加载配置文件的优先级

在 SpringBoot 应用中&#xff0c;配置文件的加载顺序&#xff08;优先级&#xff09;决定了不同来源的配置属性如何覆盖彼此&#xff0c;但是&#xff0c;在实践中&#xff0c;也会经常遇到。下面文章将分析 SpringBoot 配置文件加载的优先级&#xff0c;从高到低排列。 文章目…...

跨越时空的对话:图灵与GPT-4聊AI的前世今生

&#xff08;背景&#xff1a;虚拟咖啡厅&#xff0c;图灵身着1950年代西装&#xff0c;端着一杯热茶&#xff0c;GPT-4以全息投影形态坐在对面&#xff09; 图灵&#xff08;喝了口茶&#xff09;&#xff1a;“听说你能写诗&#xff1f;我当年在布莱切利园破解Enigma时&…...

如何通过 Seatunnel 实现 MySQL 到 OceanBase的数据迁移同步

1. 准备传输工具 本方案采用 Apache Seatunnel&#xff08;简称seatunnel&#xff09;进行MySQL 到 OceanBase 的数据迁移和同步&#xff0c;出于对方案轻量性的考量&#xff0c;我们采用其内置的Zeta引擎来实现&#xff0c;包括全量同步、离线增量同步&#xff0c;以及CDC方案…...

C++20 新特性总结

简要总结 C20 引入了四项非常大的更新, 分别是: 概念(Concepts). 用来简化模板编程, 强化表达能力. 并且使得出错原因更容易查找.模块(Modules). 这是代码组织方面非常大的更新. 提供了新的方式来组织代码, 并且可以减少编译时间.范围库(Ranges and Views). 轻量级的, 非拥有…...

软件设计模式之简单工厂模式

目录 一.类图&#xff08;手机生产&#xff09; 二.代码实现 Iphone类&#xff1a; Vivo类&#xff1a; Mobile类&#xff1a; MobileFactory类&#xff1a; Client类&#xff1a; 一.类图&#xff08;手机生产&#xff09; 补充&#xff1a;MobileFactory也可以直接指向…...