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

设计模式四:装饰模式(Decorator Pattern)

装饰模式是一种结构型设计模式,它允许你动态地给一个对象添加额外的职责,相比继承更加灵活。

1. 模式定义

装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

2. 模式结构

主要角色:

  • Component(抽象构件):定义对象的接口,可以给这些对象动态添加职责

  • ConcreteComponent(具体构件):定义具体的对象,可以给它添加职责

  • Decorator(抽象装饰类):继承/实现Component,并包含一个Component的引用

  • ConcreteDecorator(具体装饰类):向构件添加具体职责

代码: 

#include <iostream>
#include <string>// 抽象构件
class Beverage {
public:virtual ~Beverage() = default;virtual std::string getDescription() const = 0;virtual double cost() const = 0;
};// 具体构件
class Espresso : public Beverage {
public:std::string getDescription() const override {return "Espresso";}double cost() const override {return 1.99;}
};// 抽象装饰类
class CondimentDecorator : public Beverage {
protected:Beverage* beverage;
public:explicit CondimentDecorator(Beverage* beverage) : beverage(beverage) {}virtual ~CondimentDecorator() { delete beverage; }std::string getDescription() const override = 0;
};// 具体装饰类A
class Milk : public CondimentDecorator {
public:explicit Milk(Beverage* beverage) : CondimentDecorator(beverage) {}std::string getDescription() const override {return beverage->getDescription() + ", Milk";}double cost() const override {return beverage->cost() + 0.20;}
};// 具体装饰类B
class Mocha : public CondimentDecorator {
public:explicit Mocha(Beverage* beverage) : CondimentDecorator(beverage) {}std::string getDescription() const override {return beverage->getDescription() + ", Mocha";}double cost() const override {return beverage->cost() + 0.30;}
};// 使用示例
int main() {// 创建基础饮料Beverage* beverage = new Espresso();std::cout << beverage->getDescription() << " $" << beverage->cost() << std::endl;// 用装饰类包装Beverage* beverage2 = new Milk(beverage);beverage2 = new Mocha(beverage2);  // 再次装饰std::cout << beverage2->getDescription() << " $" << beverage2->cost() << std::endl;delete beverage2;  // 会递归删除所有装饰对象return 0;
}

 uml结构

 

3. 模式特点

优点:

  1. 比继承更灵活:动态添加或撤销功能

  2. 避免子类膨胀:通过组合而非继承扩展功能

  3. 符合开闭原则:对扩展开放,对修改关闭

缺点:

  1. 会产生许多小对象:增加系统复杂度

  2. 多层装饰时调试困难:需要逐层检查

4. 应用场景

  1. 扩展单个对象的功能,而不影响其他对象

  2. 动态透明地添加职责,可以随时撤销

  3. 不适合用子类扩展的情况(如子类数量爆炸)

5. 装饰模式 vs 继承

特性装饰模式继承
扩展方式动态组合静态编译时确定
灵活性高,可运行时调整低,编译时固定
对象关系组合关系父子关系
类数量装饰类数量较少可能导致子类爆炸

 装饰模式是扩展对象功能的一种灵活方式,特别适合在运行时动态添加或修改对象行为的场景。

http://www.lryc.cn/news/591200.html

相关文章:

  • 拿到安全工程师证后,能从事哪些岗位?
  • 十六进制与嵌入式系统及通信系统
  • 量化环节剖析
  • 暑期自学嵌入式——Day05(C语言阶段)
  • Oracle Data Pump 导入冲突解决
  • 九学王资源apk应用名称整理
  • 从平面到时空:地图故事的时空叙事与沉浸式阅读
  • 从单线程到云原生:Redis 二十年演进全景与内在机理深剖
  • Spring之【BeanDefinition】
  • 图片画廊浏览(侧重 CSS 网格布局和模态框交互)
  • 在分布式系统中,如何保证缓存与数据库的数据一致性?
  • 分别使用Cypher与python构建neo4j图谱
  • Mysql测试题
  • 网络爬虫的介绍
  • 【前沿技术动态】【AI总结】Spring Boot 4.0 预览版深度解析:云原生时代的新里程碑
  • 比特币技术简史 第三章:区块链技术 - 区块结构、链式结构与工作量证明
  • Spark 之 HashJoin
  • CDSS系统升级“可视化解释-智能反馈-临床语言“三位一体设计架构设计分析
  • (自用)补充说明2
  • 【组件库】VanillaTilt.js使用教程和配置项说明
  • C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
  • 【Python练习】046. 编写一个函数,检查一个数组是否是排序的
  • 算法学习笔记:27.堆排序(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 【agent实战】基于 LangGraph 实现 Agentic RAG:原理、实战与创新全解
  • Java集合处理库——collection-complete
  • React Native 基础tabBar和自定义tabBar - bottom-tabs
  • React hooks——useMemo
  • Android离线TTS实战——集成espeak-ng实现开箱即用的中文语音播报
  • Flutter:上传图片,选择相机或相册:wechat_assets_picker
  • 玖[9],相机/镜头/光源