设计模式—装饰器模式精讲
本文目录如下1. 为什么需要装饰器模式1.1 装饰器模式解决的核心痛点1.2 典型使用场景1.3 不适合装饰器模式的场景2. 装饰器模式核心体系与角色2.1 核心特点2.2 四大标准角色3. 装饰器模式标准实战实现基础版3.1 业务场景3.2 抽象组件统一消息接口3.3 具体组件原始基础实现核心不变3.4 抽象装饰器统一包装父类3.5 具体装饰器日志增强、加密增强3.6 客户端测试自由叠加、多层装饰3.7 核心代码分析4. 装饰器模式优缺点4.1 优点4.2 缺点5. 工程常见痛点与解决方案5.1 装饰器类过多、类文件泛滥5.2 多层嵌套顺序混乱导致BUG5.3 装饰器重复包装、空包装冗余5.4 接口频繁变更导致维护成本高6. 高频面试易混模式核心区分6.1 装饰器模式 vs 静态继承6.2 装饰器模式 vs 代理模式面试最高频6.3 装饰器模式 vs 适配器模式7. 装饰器模式主流框架落地面试高频7.1 JDK IO 经典落地教科书级7.2 Spring框架落地7.3 Java 集合体系落地8. 核心总结1. 为什么需要装饰器模式装饰器模式是结构型设计模式。核心目标在不修改原有对象、不使用子类继承的前提下动态、透明地给原有对象叠加额外功能。核心设计思想组合优于继承、层层包装、功能叠加、原有代码零侵入。它解决了继承拓展臃肿、静态固化、无法动态叠加功能的核心问题是替代继承做功能增强的最优工程方案。换句话讲当需要对原有类新增额外功能、拓展能力但不想改源码、不想泛滥子类、希望功能可自由组合叠加时使用装饰器模式。1.1 装饰器模式解决的核心痛点a. 继承拓展导致子类爆炸一个基础类有多种拓展能力通过继承组合会产生大量冗余子类维护成本极高。b. 功能拓展静态固化、无法动态组合继承在编译期绑定能力运行时无法灵活增减、自由搭配功能。c. 修改原有源码违反开闭原则直接改原有业务类新增功能会侵入核心逻辑增加线上风险。d. 功能耦合严重、复用性差增强逻辑写死在业务类或子类中无法独立复用、自由拆解。e. 多层拓展代码臃肿混乱多段增强逻辑堆砌在同一个方法内职责混乱、可读性极差。1.2 典型使用场景a. 需要动态叠加、自由组合功能的场景权限校验、日志记录、加密、缓存、重试、限流等可插拔增强能力。b. 原有类功能稳定、禁止修改源码的场景核心基础类稳定需要外围拓展能力零侵入增强。c. 多维度、多层级拓展能力场景IO流读写、报文解析、多层数据包装、多层加工处理。d. 替代继承做功能拓展的场景避免子类泛滥用组合包装替代静态继承。e. 运行时动态增减功能的场景根据业务策略、环境参数动态开启/关闭增强逻辑。1.3 不适合装饰器模式的场景a. 功能拓展固定、无需动态组合能力永久固定、无需叠加切换没必要多层包装。b. 原有对象结构频繁改动基础组件接口频繁变更会导致所有装饰器同步改代码。c. 仅单次简单拓展、无复用需求单次增强直接封装工具类即可过度包装属于过度设计。d. 需要大幅篡改原有核心逻辑装饰器仅做增强拓展不适合替换原有核心行为。2. 装饰器模式核心体系与角色2.1 核心特点1.透明性装饰器与原始组件实现同一接口对外行为完全一致客户端无感知2.可叠加多个装饰器可以层层嵌套、自由组合实现多层能力增强3.零侵入不修改原有基础类代码完全符合开闭原则4.组合替代继承通过对象组合包装替代臃肿的继承层级。2.2 四大标准角色抽象组件Component统一抽象接口定义原始对象和所有装饰器的统一行为规范。具体组件Concrete Component原始基础对象核心业务实现被装饰的主体功能稳定不变。抽象装饰器Decorator持有抽象组件引用实现统一接口是所有具体装饰器的父类负责统一包装。具体装饰器Concrete Decorator继承抽象装饰器叠加具体增强功能实现多层拓展能力。3. 装饰器模式标准实战实现基础版3.1 业务场景基础消息发送功能需要动态叠加日志打印、消息加密能力支持自由组合、多层叠加。3.2 抽象组件统一消息接口// 抽象组件统一行为规范 public interface MessageService { // 统一发送消息方法 void send(String content); }3.3 具体组件原始基础实现核心不变// 具体组件原始基础消息发送功能 public class BaseMessageService implements MessageService { Override public void send(String content) { System.out.println(发送原始消息 content); } }3.4 抽象装饰器统一包装父类// 抽象装饰器所有装饰器父类 public abstract class MessageDecorator implements MessageService { // 持有原始组件/装饰器引用支持层层包装 protected MessageService messageService; public MessageDecorator(MessageService messageService) { this.messageService messageService; } Override public void send(String content) { messageService.send(content); } }3.5 具体装饰器日志增强、加密增强// 具体装饰器日志装饰器 public class LogMessageDecorator extends MessageDecorator { public LogMessageDecorator(MessageService messageService) { super(messageService); } Override public void send(String content) { // 前置增强打印日志 System.out.println(【日志装饰】记录消息发送日志内容 content); // 执行原有核心逻辑 super.send(content); } } // 具体装饰器加密装饰器 public class EncryptMessageDecorator extends MessageDecorator { public EncryptMessageDecorator(MessageService messageService) { super(messageService); } Override public void send(String content) { // 前置增强模拟加密 String encryptContent 加密处理 content; // 执行原有逻辑 super.send(encryptContent); } }3.6 客户端测试自由叠加、多层装饰public class DecoratorClient { public static void main(String[] args) { // 1. 原生基础能力 MessageService base new BaseMessageService(); base.send(普通业务消息); System.out.println(----------); // 2. 单层装饰仅日志 MessageService logService new LogMessageDecorator(new BaseMessageService()); logService.send(日志增强消息); System.out.println(----------); // 3. 多层叠加加密日志 自由组合 MessageService fullService new LogMessageDecorator(new EncryptMessageDecorator(new BaseMessageService())); fullService.send(多层增强业务消息); } }3.7 核心代码分析1. 原始类BaseMessageService完全无改动符合开闭原则2. 装饰器实现同一接口客户端完全无感知透明增强3. 支持任意多层嵌套、任意顺序组合动态拓展能力4. 每个装饰器单一职责只负责自己的增强逻辑可独立复用。4. 装饰器模式优缺点4.1 优点1. 完美符合开闭原则新增增强能力只需新增装饰器不改动原有核心代码。2. 彻底解决子类爆炸问题用组合替代继承无需为每种能力组合创建子类。3. 功能灵活可叠加、可自由组合运行时动态嵌套包装按需开启多层增强。4. 职责单一、解耦彻底每个装饰器只负责一项增强能力代码清晰、易维护、易测试。5. 透明增强、客户端无感知装饰器与原对象接口一致无缝替换。4.2 缺点1. 产生大量装饰器包装类每一种增强都需要一个装饰器类类数量增多。2. 多层嵌套阅读成本高多层包装叠加后调用链路长排查问题需要逐层拆解。3. 顺序依赖问题部分增强逻辑有先后顺序嵌套顺序错误会导致业务异常。4. 接口变动影响所有装饰器当顶层组件接口发生修改时所有依赖该接口的装饰器都需要同步进行适配更新。5. 工程常见痛点与解决方案5.1 装饰器类过多、类文件泛滥问题增强能力过多每个能力单独建类项目结构臃肿。解决方案将轻量增强能力通过静态内部类、统一聚合装饰器收拢减少类文件数量。5.2 多层嵌套顺序混乱导致BUG问题加密、日志、校验、重试等有执行顺序手动嵌套容易写反。解决方案提供装饰器工具构建链统一封装顺序客户端链式调用无需关心层级。5.3 装饰器重复包装、空包装冗余问题重复叠加相同装饰器导致逻辑重复执行。解决方案增加包装标记、容器去重控制每种装饰器仅叠加一次。5.4 接口频繁变更导致维护成本高解决方案顶层组件接口尽量稳定将高频变动的拓展逻辑下沉至装饰器保证核心接口不动。6. 高频面试易混模式核心区分6.1 装饰器模式 vs 静态继承继承编译期静态绑定能力固定、无法动态叠加、子类泛滥、耦合极高。装饰器运行时动态组合能力自由叠加、单一职责、低耦合、符合开闭。6.2 装饰器模式 vs 代理模式面试最高频装饰器模式侧重功能增强、能力叠加透明拓展原有功能核心是「加能力」可以多层嵌套。代理模式侧重访问控制、资源管控控制对象的访问、创建、销毁核心是「管对象」一般单层代理。6.3 装饰器模式 vs 适配器模式装饰器接口不变增强原有能力属于同体系拓展。适配器接口不统一转换接口适配兼容属于跨体系适配。7. 装饰器模式主流框架落地面试高频7.1 JDK IO 经典落地教科书级InputStream为抽象组件FileInputStream为原始具体组件BufferedInputStream、DataInputStream是具体装饰器。底层完全遵循装饰器思想原始文件流 缓存装饰 数据解析装饰可自由组合叠加能力。7.2 Spring框架落地Spring Bean包装拓展BeanWrapper、DecoratingClassLoader均采用装饰器思想对原生对象做包装增强。Spring MVC请求包装HttpServletRequestWrapper、HttpServletResponseWrapper装饰原生请求响应对象实现请求参数修改、包装、增强。7.3 Java 集合体系落地Collections.synchronizedList、unmodifiableList是典型装饰器实现对原生List集合做线程安全、只读能力装饰增强不修改原集合源码。8. 核心总结装饰器模式的核心本质组合替代继承、动态叠加功能、透明增强、零侵入拓展是结构型模式中最适合做可插拔功能增强的核心模式。工程落地选型规范1.需要动态叠加、多维度拓展优先用装饰器彻底杜绝子类爆炸2. 功能增强、日志、加密、缓存、限流等通用能力统一封装为装饰器解耦业务3. 严格遵循单一职责一个装饰器只做一种增强保证可复用、可拆解4. 区分代理、适配器模式不混用、不滥用避免过度设计。装饰器模式是 IO 体系、Spring 底层、日常业务增强的核心基石掌握其「层层包装、动态叠加」的思想是读懂源码、写出高拓展代码的关键。

相关新闻

SIS/SIR 传播模型实战:Python 模拟舆情扩散,异质平均场方法解析传播阈值

SIS/SIR 传播模型实战:Python 模拟舆情扩散,异质平均场方法解析传播阈值

SIS/SIR 传播模型实战:Python 模拟舆情扩散与异质平均场方法解析1. 传播模型基础与Python实现在社交网络分析领域,SIS和SIR模型作为经典的信息传播框架,为我们理解舆情扩散提供了强有力的数学工具。与传统的理论讲解不同,我们将直…

2026/7/8 13:05:01阅读更多 →
别再堆人工了!聊聊怎么用接口把微信改成自动客服系统,省时还稳妥

别再堆人工了!聊聊怎么用接口把微信改成自动客服系统,省时还稳妥

大家在给公司写客服系统或者消息接待工具的时候,经常会遇到一个挺折腾人的问题:每天有海量的用户在微信群里或者私聊发各种咨询,查订单的、要资料的什么都有。如果全靠人工客服在电脑前干坐着,一个字一个字地复制粘贴去回&#xf…

2026/7/8 13:05:01阅读更多 →
计算机毕业设计之基于web的在线编辑平台

计算机毕业设计之基于web的在线编辑平台

信息技术是当今社会发展的重要方向之一,它已经深入到各个行业中。随着计算机技术的发展,信息技术已经从传统的数据处理转变为网络信息的处理和交互。在管理方面,通过信息管理技术,系统可以快速的处理大量的数据,并且能…

2026/7/8 13:05:01阅读更多 →
选专业厨房空调服务商要看哪些通用标准和适配条件?

选专业厨房空调服务商要看哪些通用标准和适配条件?

大家好,今天我会给大家分享专业厨房空调服务商的通用选型标准和适配条件,不过要说明的是,我只是提供选型方法,不会做具体的产品推荐。通用选型标准产品性能: 制冷能力:厨房在烹饪过程中会产生大量热量&…

2026/7/8 13:50:17阅读更多 →
如何用FontCenter智能解决AutoCAD字体缺失的世纪难题?

如何用FontCenter智能解决AutoCAD字体缺失的世纪难题?

如何用FontCenter智能解决AutoCAD字体缺失的世纪难题? 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 作为一名CAD设计师,你是否经历过这样的场景:打开一份重要的工程…

2026/7/8 13:50:17阅读更多 →
智慧公厕的“隐私边界”:刷脸取纸、智能监控……科技便利与个人隐私如何两全?

智慧公厕的“隐私边界”:刷脸取纸、智能监控……科技便利与个人隐私如何两全?

一、引言:一张厕纸引发的隐私焦虑 去年夏天,泸州市民王女士走进江阳区一座刚完成“暖心行动”升级的公厕,看到洗手台旁多了一台崭新的智能人脸识别取纸机。站定、刷脸、几秒钟——一段免费厕纸自动滑出,全程无需触碰任何按钮。方…

2026/7/8 13:50:17阅读更多 →
STM32与TPA3138D2构建高效音频系统设计指南

STM32与TPA3138D2构建高效音频系统设计指南

1. 项目背景与硬件选型解析在嵌入式音频系统设计中,D类放大器与微控制器的组合已成为提升音频质量的主流方案。TPA3138D2作为德州仪器推出的高效D类音频放大器,配合STM32F401RB这款ARM Cortex-M4内核微控制器,能够构建出性能优异且成本可控的…

2026/7/8 13:50:17阅读更多 →
京东方:面板龙头转型路,高研发与低净利困境下能否价值重估?

京东方:面板龙头转型路,高研发与低净利困境下能否价值重估?

1. 逆势上涨:京东方惊艳股市“全球面板之王”京东方让全球股市见识了“周期龙头”的实力!7月2日,在META卖算力砸崩全球科技股当天,京东方A(000725.SZ)逆势上涨3.76%。此前,从5月21日至7月2日&am…

2026/7/8 13:50:17阅读更多 →
思维运行模式 的最小单位是什么?

思维运行模式 的最小单位是什么?

第一层:什么是思维运行模式? 很多人认为: 思维运行模式性格。其实不是。 性格比较稳定。 而思维运行模式更像:大脑面对一个情况时,信息是怎样流动的。例如。 同样收到面试失败。 A: 失败↓分析不足↓修改简…

2026/7/8 13:45:16阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/8 5:12:14阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/8 7:00:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/8 2:26:06阅读更多 →
作为一个给团队打绩效的人,我想说几句

作为一个给团队打绩效的人,我想说几句

我每半年都会给团队成员打绩效,也会参与和 CTO 的绩效校准,所以从管理者的视角,说说这件事 首先,我先把结论告诉你:接受结果,但一定要把原因问清楚。 因为当绩效公布到你这里的时候,结果基本已…

2026/7/8 0:01:17阅读更多 →
A股股指期货:全维度解析(多表格结构化完整版)

A股股指期货:全维度解析(多表格结构化完整版)

一、基础定义与核心本质股指期货全称股票价格指数期货,是中国金融期货交易所(中金所)上市的标准化金融期货合约,交易标的为 A 股大盘指数,约定未来特定时间按约定价格现金交割指数涨跌差价,不交割一篮子股票…

2026/7/8 0:01:17阅读更多 →
iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &…

2026/7/8 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/8 6:59:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/8 13:42:39阅读更多 →