新闻中心

C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责

2025-12-01
浏览次数:
返回列表
装饰器模式通过组合与继承动态扩展对象功能,以统一接口Component和具体实现ConcreteComponent为基础,使新增职责透明且可叠加。

c++如何实现一个装饰器模式_c++设计模式之动态地给对象添加额外职责

装饰器模式的核心是动态地给对象添加职责,而不改变原有类结构。在C++中,可以通过组合和继承的方式实现这一设计模式,让扩展功能像“包装”一样层层叠加。

定义统一接口

装饰器模式依赖于一个公共接口,所有具体组件和装饰器都实现这个接口。这样客户端可以透明地使用原始对象或被装饰后的对象。

示例:

Component 是抽象基类,声明操作接口:

class Component {
public:
    virtual ~Component() = default;
    virtual void operation() = 0;
};

实现具体组件

ConcreteComponent 是被装饰的原始对象,提供基本行为。

class ConcreteComponent : public Component {
public:
    void operation() override {
        std::cout << "基础功能" << std::endl;
    }
};

构建装饰器基类

Decorator 类也继承自 Component,并持有一个 Component 指针。它将请求转发给被包装的对象,子类可在转发前后添加逻辑。

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1587 查看详情 小云雀
class Decorator : public Component {
protected:
    Component* component;
public:
    explicit Decorator(Component* c) : component(c) {}
    void operation() override {
        component->operation(); // 转发请求
    }
};

实现具体装饰器

ConcreteDecoratorA 和 B 在调用原对象方法前后添加新行为,实现功能增强。

class ConcreteDecoratorA : public Decorator {
public:
    ConcreteDecoratorA(Component* c) : Decorator(c) {}
    void operation() override {
        Decorator::operation(); // 先执行原逻辑
        std::cout << "附加功能A" << std::endl;
    }
};
<p>class ConcreteDecoratorB : public Decorator {
public:
ConcreteDecoratorB(Component* c) : Decorator(c) {}
void operation() override {
std::cout << "前置处理:B" << std::endl;
Decorator::operation();
std::cout << "后置处理:B" << std::endl;
}
};

使用时可多层嵌套:

int main() {
    Component* comp = new ConcreteComponent();
    comp = new ConcreteDecoratorA(comp);
    comp = new ConcreteDecoratorB(comp);
    comp->operation();
<pre class="brush:php;toolbar:false;">// 记得释放内存(或使用智能指针)
delete comp;
return 0;

}

输出结果为:
基础功能
附加功能A
前置处理:B
后置处理:B

基本上就这些。通过指针组合和虚函数机制,C++能灵活实现装饰器模式,避免类爆炸问题,同时保持运行时的扩展能力。关键在于保持接口一致性和正确管理对象生命周期。不复杂但容易忽略细节。

以上就是C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责的详细内容,更多请关注其它相关文章!


# 相关文章  # 大连专业seo优化  # dx的seo现状  # 淘宝优化seo有用吗  # 建设网站的公司推荐  # 永州整合营销网络推广seo  # 嘉兴涂装设备网站建设  # 青羊区旅游网站建设流程  # 张家港seo网络管理  # 新的网站怎么推广赚钱  # 俄罗斯11大关键词排名  # c++  # 而不  # 这一  # 迭代  # 象中  # 如何处理  # 尼克  # 如何实现  # 子类  # 如何使用  # 装饰器模式 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: mc.js官网登录入口 mc.js官方登录入口最新版  J*aScript map 迭代中检测空数组元素的有效方法  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  整合Supabase认证与Django模型:跨模式迁移的解决方案  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  小米14应用无法联网原因分析_小米14网络权限修复  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  R星幕后开发视频泄露 包含《GTA6》等多款大作  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  Python模块化编程:有效管理依赖与避免循环引用  2025-2030年全球乘用车销量预测:新能源成增长主力  Eclipse怎么运行工程_Eclipse工程运行配置说明  押井守高度称赞《辐射4》:玩了八年都停不下来!  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  mc.js免安装版 mc.js一键畅玩入口  poki免费入口快捷访问 poki人气小游戏直接玩站点  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  J*aScript实现单选按钮与关联输入框的联动禁用教程  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  美团外卖商家服务中心入口 美团商家版官网入口  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  mc.js游戏直达 mc.js网页免下载版本秒进地址  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  Golang如何安装Swagger工具_GoSwagger文档生成环境  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  网站内容防复制粘贴的实现策略与局限性  圆通快递查询实时追踪 圆通物流包裹状态快速查看  b站赚钱渠道_b站收益来源  快手赚钱渠道_快手收益来源  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  抖音未来赚钱的新趋势 2025年值得关注的变现风口分析  J*a递归快速排序中静态变量的状态管理与陷阱  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  曝R星经典之作开发图 设计简陋但信息密集!  小米汽车11月交付量突破40000台!雷军:将继续努力  必由学登录入口 必由学官方网站在线访问链接  CSS实现侧边栏导航项全宽圆角悬停背景效果  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  马斯克:Optimus 人形机器人复数形式为 Optimi  win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】 

搜索