新闻中心

c++如何实现一个装饰器模式_c++结构型设计模式Decorator【实例】

2025-12-13
浏览次数:
返回列表
C++可通过接口抽象、类组合与智能指针委托实现装饰器模式:定义统一Component接口,Concrete Component实现基础功能,Decorator基类持有并转发Component指针,Concrete Decorators添加具体职责,运行时动态组合。

c++如何实现一个装饰器模式_c++结构型设计模式decorator【实例】

在 C++ 中没有 Python 那样原生的 @decorator 语法,但可以通过类组合 + 接口抽象 + 指针/智能指针委托,完整实现装饰器模式(Decorator Pattern)——它属于结构型设计模式,核心是「动态地为对象添加职责,而不改变其原有结构」。

定义统一接口(Component)

所有被装饰对象和装饰器都要实现同一接口,保证可替换性:

class Coffee {
public:
    virtual ~Coffee() = default;
    virtual std::string getDescription() const = 0;
    virtual double getCost() const = 0;
};

实现具体组件(Concrete Component)

基础对象,比如一杯普通咖啡:

class SimpleCoffee : public Coffee {
public:
    std::string getDescription() const override {
        return "Simple coffee";
    }
    double getCost() const override {
        return 2.0;
    }
};

定义装饰器基类(Decorator)

关键:持有 Component 智能指针,并转发调用;自身也继承 Component,支持层层嵌套:

class CoffeeDecorator : public Coffee {
protected:
    std::unique_ptr<Coffee> coffee_;

public:
    explicit CoffeeDecorator(std::unique_ptr<Coffee> coffee)
        : coffee_(std::move(coffee)) {}

    std::string getDescription() const override {
        return coffee_->getDescription();
    }

    double getCost() const override {
        return coffee_->getCost();
    }
};

实现具体装饰器(Concrete Decorators)

每个装饰器只负责一项增强逻辑,例如加牛奶、加糖、加焦糖:

Figma Figma

Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

Figma 1371 查看详情 Figma
  • MilkDecorator:在描述后追加 " + milk",成本 +0.5
  • SugarDecorator:描述追加 " + sugar",成本 +0.2
  • CaramelDecorator:描述追加 " + caramel",成本 +0.8

以 MilkDecorator 为例:

class MilkDecorator : public CoffeeDecorator {
public:
    explicit MilkDecorator(std::unique_ptr<Coffee> coffee)
        : CoffeeDecorator(std::move(coffee)) {}

    std::string getDescription() const override {
        return CoffeeDecorator::getDescription() + " + milk";
    }

    double getCost() const override {
        return CoffeeDecorator::getCost() + 0.5;
    }
};

组合使用(动态装配)

运行时自由组合,无需修改原有类:

auto coffee = std::make_unique<SimpleCoffee>();
coffee = std::make_unique<MilkDecorator>(std::move(coffee));
coffee = std::make_unique<SugarDecorator>(std::move(coffee));
coffee = std::make_unique<CaramelDecorator>(std::move(coffee));

std::cout << coffee->getDescription() << "\n"; // Simple coffee + milk + sugar + caramel
std::cout << "Cost: $" << coffee->getCost() << "\n"; // 3.5

注意:用 std::unique_ptr 管理所有权,避免内存泄漏;也可用 std::shared_ptr 支持共享引用。

基本上就这些。装饰器模式在 C++ 中靠「接口抽象 + 组合委托 + 多态调用」落地,重点是让装饰器和被装饰者类型一致,才能无缝嵌套。不复杂但容易忽略的是:必须统一接口、装饰器必须持有并转发原始对象、构造时用 move 语义提升效率。

以上就是c++++如何实现一个装饰器模式_c++结构型设计模式Decorator【实例】的详细内容,更多请关注其它相关文章!


# 中文网  # 网站建设服务器挑选  # 优化网站有哪些方法  # 网站推广链接源码  # 西乡网站建设免费  # 新手建设网站注意什么  # 无锡关键词排名软件  # seo操作密码教学  # 孝感seo厂家  # 校园驾校推广营销方案怎么写  # 文山商城网站建设  # 解决问题  # python  # 可以通过  # 相关文章  # 而不  # 都要  # 焦糖  # 的是  # 多态  # 如何实现  # red  # cos  # c++ 


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


相关推荐: 微信商城在哪里打开【步骤】  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Lar*el Form Request中唯一性验证在更新操作中的正确实现  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  如何使用Go和Martini动态服务解码后的图片  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  必由学官网首页入口 必由学教师网页版登录指南  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  探索高级语言到原生C/C++的转译:挑战与内存管理策略  PDF文件体积过大处理_PDF压缩技巧详解  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  优化Log4j2控制台输出性能:解决异步日志瓶颈  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  百度网盘网页版入口 百度网盘网页版官方登录网址  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  Lar*el DB::listen 事件中的查询执行时间单位解析  Python getattr() 异常处理深度解析:避免程序意外退出  Log4j Console Appender性能瓶颈与高并发优化策略  夸克浏览器图书入口 夸克手机浏览器阅读入口  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  Lar*el递归关系中排除子孙节点的策略  微博网页版官方账号登录 微博网页版内容浏览使用指南  Python类型检查:优化关联可选属性的Mypy推断策略  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  在Pyomo中实现基于变量的条件约束:Big-M方法详解  C#使用XPath查询节点时出错? 常见语法错误与调试技巧 

搜索