新闻中心
C++如何实现一个装饰器模式_C++在不改变对象结构的情况下动态添加功能
装饰器模式通过组合方式在不修改原始类的情况下动态扩展对象功能,C++中利用继承与指针成员实现Component、ConcreteComponent、Decorator和ConcreteDecorator角色,示例中PlainText作为基础文本,BoldText与ItalicText依次装饰,最终输出嵌套HTML标签的“Hello World”,体现了运行时灵活叠加行为的优势,符合开闭原则,但需注意装饰链长度、内存管理及装饰顺序对结果的影响。

装饰器模式的核心是在不修改原始类的前提下,动态地给对象添加新功能。C++中可以通过继承和组合的方式实现这一设计模式,尤其适合需要在运行时灵活扩展功能的场景。
装饰器模式的基本结构
该模式包含以下几个关键角色:
- Component(组件接口):定义对象的公共接口,可以是抽象类或接口。
- ConcreteComponent(具体组件):实现基本功能的对象。
- Decorator(装饰器基类):持有 Component 指针,并实现相同的接口。
- ConcreteDecorator(具体装饰器):在原有功能基础上添加新行为。
代码实现示例
下面是一个简单的文本显示功能的装饰器实现:
#include <iostream> #include <string> <p>// 组件接口 class TextComponent { public: virtual ~TextComponent() = default; virtual std::string getContent() const = 0; };</p><p>// 具体组件:基础文本 class PlainText : public TextComponent { std::string text; public: explicit PlainText(const std::string& t) : text(t) {} std::string getContent() const override { return text; } };</p><p>// 装饰器基类 class TextDecorator : public TextComponent { protected: TextComponent<em> component; public: explicit TextDecorator(TextComponent</em> c) : component(c) {} virtual ~TextDecorator() { delete component; } std::string getContent() const override { return component->getContent(); } };</p><p>// 具体装饰器:加粗 class BoldText : public TextDecorator { public: using TextDecorator::TextDecorator; std::string getContent() const override { return "<b>" + component->getContent() + "</b>"; } };</p><p>// 具体装饰器:斜体 class ItalicText : public TextDecorator { public: using TextDecorator::TextDecorator; std::string getContent() const override { return "<i>" + component->getContent() + "</i>"; } };</p>
使用方式如下:
拾贝
一键同步微信读书所有笔记和划线,并在新标签页回顾
186
查看详情
int main() {
TextComponent* text = new PlainText("Hello World");
text = new BoldText(text);
text = new ItalicText(text);
<pre class='brush:php;toolbar:false;'>std::cout << text->getContent() << std::endl;
// 输出: <b><i>Hello World</i></b>
delete text; // 自动释放内部对象
return 0;}
优势与注意事项
这种实现方式的优点在于:
- 可以在运行时动态组合功能,而不是编译时固定行为。
- 避免了通过继承产生大量子类的问题。
- 符合开闭原则:对扩展开放,对修改关闭。
需要注意的地方:
- 装饰器链过长可能影响性能。
- 内存管理要小心,建议使用智能指针替代裸指针。
- 多个装饰器之间的顺序可能影响最终结果。
基本上就这些。装饰器模式在需要逐步增强对象能力时非常实用,比如日志、权限校验、缓存等功能的叠加。关键是保持接口一致,让客户端无感知地使用被装饰后的对象。
以上就是C++如何实现一个装饰器模式_C++在不改变对象结构的情况下动态添加功能的详细内容,更多请关注其它相关文章!
# 是一个
# seo推广平台帝
# 建设大型网站游戏违法吗
# 广安seo优化定做
# 汕头网站建设集团
# 兰州网站建设的建议
# 推广兼职的网站
# 网站做优化答案易速达
# 番禺网站建设流程有哪些
# 云南双重日晒seo
# 河南百度网站排名优化
# 内存管理
# 单元测试
# html
# 自动生成
# 不改变
# 如何实现
# 文档
# 拾贝
# 情况下
# 子类
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何使用Go和Martini动态服务解码后的图片
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
抖音创作助手登录入口_抖音创作辅助工具官网直达
j*a toString()的覆盖
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
圆通快递查询实时追踪 圆通物流包裹状态快速查看
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025
抖音从哪里进入网页版_抖音官方入口链接
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
小米Civi 4录制视频过暗_小米Civi 4亮度优化
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
探索高级语言到原生C/C++的转译:挑战与内存管理策略
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
Win11怎么关闭快速启动_Win11彻底关机设置教程
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
必由学官方平台入口 必由学在线课堂登录地址
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
AO3官方可用镜像 Archive of Our Own网页版最新入口
铁路12306的积分有效期是多久_铁路12306积分有效期说明
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践
J*aScript中赋值与自增运算符的复杂交互与执行机制
AO3最新官网入口公告_2025AO3镜像站实时查询方法
漫蛙漫画网页端入口 漫蛙2官方正版漫画站点
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
AO3网页版最新入口合集 Archive of Our Own在线访问指南
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
解决移动端滚动问题的overflow属性应用指南
批改网学生版PC登录 批改网官网登录系统入口
响应式图片在网页设计中的正确实现方法
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
微信网页版官方入口教程 微信网页版网页版快速登录步骤
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
将JSON对象数组转置为键值对列表的实用指南
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
如何在 Excel Online 和 Google 表格中更改日期格式
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
Win11怎么开启省电模式_Win11电池节电模式自动开启
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
css绝对定位元素脱离父容器怎么办_确保父元素position非static


2025-12-05
浏览次数:次
返回列表
t {
public:
virtual ~TextComponent() = default;
virtual std::string getContent() const = 0;
};</p><p>// 具体组件:基础文本
class PlainText : public TextComponent {
std::string text;
public:
explicit PlainText(const std::string& t) : text(t) {}
std::string getContent() const override {
return text;
}
};</p><p>// 装饰器基类
class TextDecorator : public TextComponent {
protected:
TextComponent<em> component;
public:
explicit TextDecorator(TextComponent</em> c) : component(c) {}
virtual ~TextDecorator() { delete component; }
std::string getContent() const override {
return component->getContent();
}
};</p><p>// 具体装饰器:加粗
class BoldText : public TextDecorator {
public:
using TextDecorator::TextDecorator;
std::string getContent() const override {
return "<b>" + component->getContent() + "</b>";
}
};</p><p>// 具体装饰器:斜体
class ItalicText : public TextDecorator {
public:
using TextDecorator::TextDecorator;
std::string getContent() const override {
return "<i>" + component->getContent() + "</i>";
}
};</p>