设计模式之装饰模式
1 核心定义装饰模式是一种结构型设计模式它允许在不改变现有对象结构的情况下动态地给该对象添加一些额外的职责。装饰模式通过创建包装对象装饰器来包裹真实对象提供了比继承更有弹性的替代方案。2 核心思想继承的替代方案提供比继承更灵活的扩展方式开闭原则对扩展开放对修改封闭动态性可以在运行时动态添加或撤销功能透明性装饰对象和真实对象具有相同的接口3 结构组成Component组件接口定义对象接口可动态添加职责ConcreteComponent具体组件实现组件接口的具体对象Decorator装饰器抽象类持有一个组件引用实现组件接口ConcreteDecorator具体装饰器向组件添加具体职责4 应用场景举例以咖啡订单系统为例假设我们需要计算不同咖啡饮品的价格和描述基础咖啡浓缩咖啡、美式咖啡配料牛奶、摩卡、奶油等顾客可以自由组合基础咖啡和配料5 UML6 c 代码实现#includeiostream#includestringusingnamespacestd;// 抽象组件咖啡接口classCoffee{public:virtual~Coffee()default;virtualstringgetDescription()const0;virtualdoublecost()const0;};// 具体组件浓缩咖啡classEspresso:publicCoffee{public:stringgetDescription()constoverride{return浓缩咖啡;}doublecost()constoverride{return25.0;// 基础价格25元}};// 具体组件美式咖啡classAmericano:publicCoffee{public:stringgetDescription()constoverride{return美式咖啡;}doublecost()constoverride{return20.0;// 基础价格20元}};// 抽象装饰器配料装饰器classCoffeeDecorator:publicCoffee{protected:Coffee*coffee;// 持有的被装饰对象public:CoffeeDecorator(Coffee*c):coffee(c){}stringgetDescription()constoverride{returncoffee-getDescription();}doublecost()constoverride{returncoffee-cost();}virtual~CoffeeDecorator(){deletecoffee;}};// 具体装饰器牛奶classMilk:publicCoffeeDecorator{public:Milk(Coffee*c):CoffeeDecorator(c){}stringgetDescription()constoverride{returncoffee-getDescription() 牛奶;}doublecost()constoverride{returncoffee-cost()5.0;// 牛奶加5元}};// 具体装饰器摩卡classMocha:publicCoffeeDecorator{public:Mocha(Coffee*c):CoffeeDecorator(c){}stringgetDescription()constoverride{returncoffee-getDescription() 摩卡;}doublecost()constoverride{returncoffee-cost()8.0;// 摩卡加8元}};// 具体装饰器奶油classWhip:publicCoffeeDecorator{public:Whip(Coffee*c):CoffeeDecorator(c){}stringgetDescription()constoverride{returncoffee-getDescription() 奶油;}doublecost()constoverride{returncoffee-cost()6.0;// 奶油加6元}};// 客户端代码intmain(){// 点一杯浓缩咖啡加牛奶和摩卡Coffee*coffeenewEspresso();coffeenewMilk(coffee);coffeenewMocha(coffee);cout订单: coffee-getDescription()endl;cout价格: coffee-cost()元endl;deletecoffee;return0;}7 总结如果不使用装饰模式可能会有以下几种实现方式方式1使用继承每个组合创建一个子类// 问题类爆炸classEspressoWithMilk:publicEspresso{/* ... */};classEspressoWithMocha:publicEspresso{/* ... */};classEspressoWithMilkAndMocha:publicEspresso{/* ... */};classAmericanoWithMilk:publicAmericano{/* ... */};// ... 需要为每种组合创建类如果有3种基础咖啡和5种配料就需要3*2^596个类方式2使用属性标志classCoffee{private:boolhasMilk;boolhasMocha;boolhasWhip;// ... 需要为每种配料添加标志public:doublecost(){doubletotalbasePrice;if(hasMilk)total5;if(hasMocha)total8;if(hasWhip)total6;returntotal;}};主要问题1 违反开闭原则每次添加新的配料都需要修改Coffee类2 代码臃肿类的职责过重包含所有配料的逻辑3 维护困难添加新配料需要修改现有代码容易引入bug4 灵活性差无法动态改变配料组合配料的组合在编译时就固定了5 代码重复如果配料的价格计算逻辑复杂不同咖啡类中会有重复代码装饰模式的优势1 灵活扩展可以在不修改现有代码的情况下添加新功能2 组合自由可以在运行时自由组合不同的装饰器3 符合单一职责每个装饰器只负责一个特定的功能4 避免类爆炸不需要为每个组合创建新的子类5 可撤销可以动态地添加或移除装饰器装饰模式通过将复杂的功能分解为简单的小功能并通过组合的方式实现复杂功能是一种非常灵活的代码组织方式。

相关新闻

OFA-Image-Caption前端交互开发:基于Vue.js的实时图像描述演示系统

OFA-Image-Caption前端交互开发:基于Vue.js的实时图像描述演示系统

OFA-Image-Caption前端交互开发:基于Vue.js的实时图像描述演示系统 你有没有想过,让电脑像人一样“看图说话”?比如,上传一张你家宠物的照片,系统就能自动生成一段生动的描述:“一只橘猫慵懒地躺在沙发上&…

2026/7/5 12:54:48 阅读更多 →
SmallThinker-3B-Preview嵌入式AI应用实战:STM32F103C8T6边缘计算集成

SmallThinker-3B-Preview嵌入式AI应用实战:STM32F103C8T6边缘计算集成

SmallThinker-3B-Preview嵌入式AI应用实战:STM32F103C8T6边缘计算集成 最近和几个做硬件的朋友聊天,他们都在抱怨一个问题:现在的智能设备,动不动就要联网、要上云,数据传上去处理完再传回来,延迟高不说&a…

2026/7/5 0:39:53 阅读更多 →
Qwen-Image-2512-SDNQ Web服务部署教程:防火墙端口开放与公网访问安全配置

Qwen-Image-2512-SDNQ Web服务部署教程:防火墙端口开放与公网访问安全配置

Qwen-Image-2512-SDNQ Web服务部署教程:防火墙端口开放与公网访问安全配置 1. 项目概述与核心价值 Qwen-Image-2512-SDNQ-uint4-svd-r32是一个强大的图片生成模型,通过Web服务封装,让用户能够直接在浏览器中输入文字描述就能生成精美的图片…

2026/5/17 9:19:28 阅读更多 →

最新新闻

基于YOLOv10的红外目标检测实战指南

基于YOLOv10的红外目标检测实战指南

1. 项目背景与核心价值去年夏天,我在参与一个山区救援项目时,亲眼目睹了传统无人机监控系统的局限性。在浓烟和夜间环境下,普通摄像头完全失效,而热成像设备虽然能捕捉到热源,却无法准确识别是人、动物还是车辆。正是这…

2026/7/5 12:51:58 阅读更多 →
AIAgent之工具调用:Function Call 与 Tool Use

AIAgent之工具调用:Function Call 与 Tool Use

工具调用:Function Call 与 Tool Use工具调用是 Agent 的「手」,让大模型能操作外部世界。这篇讲 Function Calling 的原理、工具怎么定义、模型怎么选工具、参数怎么传、常见的工具类型,以及开发中的最佳实践。大家好,我是黒漂技…

2026/7/5 12:49:55 阅读更多 →
ICM-42688-P与STM32F746ZG在工业自动化中的应用

ICM-42688-P与STM32F746ZG在工业自动化中的应用

1. ICM-42688-P与STM32F746ZG的黄金组合解析 在工业自动化和机器人控制领域,传感器与微控制器的协同设计直接决定了系统的性能上限。ICM-42688-P作为TDK InvenSense推出的6轴MEMS运动传感器,与STMicroelectronics的STM32F746ZG Cortex-M7微控制器形成的硬…

2026/7/5 12:47:54 阅读更多 →
混合整数二次规划在模型预测控制中的应用与求解器对比

混合整数二次规划在模型预测控制中的应用与求解器对比

1. 混合整数二次规划在模型预测控制中的核心作用 混合整数二次规划(MIQP)作为模型预测控制(MPC)中处理离散决策变量的关键技术,其核心价值在于平衡计算复杂度和控制性能。在车辆动力系统控制这类典型应用中,变速箱档位选择、发动机启停等离散决策变量与连…

2026/7/5 12:47:54 阅读更多 →
YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

如果你在 2024 年或 2025 年才开始接触 YOLO,可能会觉得它已经是一个“古老”且“成熟”的技术栈,网上教程遍地都是,随便找个代码跑起来似乎并不难。但当你真正想把它用起来,无论是做一个毕业设计、一个内部工具,还是想…

2026/7/5 12:45:54 阅读更多 →
RT-DETR实战:从原理到部署,掌握实时目标检测新范式

RT-DETR实战:从原理到部署,掌握实时目标检测新范式

如果你正在为毕业设计、学术论文或者项目选型而纠结,面对目标检测领域两大主流技术路线——YOLO系列和DETR系列——不知道该如何选择,那么这篇文章就是为你准备的。这不仅仅是“YOLO vs DETR”的简单对比,更是一个关于技术范式、工程实践和未…

2026/7/5 12:45:54 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻