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

【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景

文章目录前言1. 装饰器模式是什么2. 装饰器模式解决什么问题3. 实现步骤4. 静态结构4.1 抽象组件Coffee统一接口4.2 具体组件SimpleCoffee基础咖啡4.3 装饰器抽象类CoffeeDecorator4.4 具体装饰器Milk / Sugar5. 动态结构 / 运行时替换点6. 优缺点6.1 优点6.2 缺点7. 和模板方法模式对比7.1 都能“增强行为”但侧重点不同7.2 谁来控制流程8. 和代理模式或外观模式的区别8.1 装饰器 vs 代理8.2 装饰器 vs 外观9. 总结前言在面向对象设计里我们经常遇到这样的需求给一个对象“加功能”而且不想改它的类也不想用继承把功能层层叠叠地搞爆。这时候装饰器模式Decorator Pattern就很合适。可以把它理解成在不改变原对象代码的前提下用“包装一层层”的方式给对象动态叠加职责。1. 装饰器模式是什么**装饰器模式**在不改变原对象结构的情况下通过创建一个包装类Decorator在运行时给对象增加额外功能。它的核心角色一般是Component抽象组件定义对象的公共接口业务能力ConcreteComponent具体组件真正的被装饰对象Decorator装饰器抽象类/基类持有一个Component并实现接口用于“转发 增强”ConcreteDecorator具体装饰器对某个/某类功能进行增强例如加日志、加缓存、加权限2. 装饰器模式解决什么问题典型场景是你想给对象增加功能但功能组合有很多种且希望可灵活启用/禁用。常见例子UI 控件增强文本框 边框文本框 边框 水印文本框 边框 校验 错误提示…请求/响应增强统一日志统一鉴权统一缓存统一压缩/序列化…流式处理输入流 解密输出流 编码输入流 校验 解密…电商价格/计费规则拼装基础价格 满减 优惠券 会员价…3. 实现步骤先抽象出公共接口Component明确“对象能做什么”核心方法签名写一个或多个ConcreteComponent提供基础能力被装饰者写装饰器基类Decorator内部持有一个Component大多数情况下先把调用转发给被包装对象写一个或多个ConcreteDecorator在转发前/后做增强也可以选择不转发、改变结果更灵活客户端按需“层层包裹”这一步带来装饰器模式的“动态叠加”能力4. 静态结构用一个“咖啡加料”例子来展示装饰器模式的静态结构与调用关系。4.1 抽象组件Coffee统一接口publicinterfaceCoffee{Stringmake();}4.2 具体组件SimpleCoffee基础咖啡publicclassSimpleCoffeeimplementsCoffee{OverridepublicStringmake(){return基础咖啡;}}4.3 装饰器抽象类CoffeeDecoratorpublicabstractclassCoffeeDecoratorimplementsCoffee{protectedCoffeecoffee;// 持有被装饰对象publicCoffeeDecorator(Coffeecoffee){this.coffeecoffee;}OverridepublicStringmake(){returncoffee.make();// 默认转发}}4.4 具体装饰器Milk / SugarpublicclassMilkDecoratorextendsCoffeeDecorator{publicMilkDecorator(Coffeecoffee){super(coffee);}OverridepublicStringmake(){returncoffee.make() 加奶;}}publicclassSugarDecoratorextendsCoffeeDecorator{publicSugarDecorator(Coffeecoffee){super(coffee);}OverridepublicStringmake(){returncoffee.make() 加糖;}}5. 动态结构 / 运行时替换点装饰器模式真正“动态”的地方在于运行时决定包裹哪些装饰器以及包裹顺序。客户端示例publicclassClient{publicstaticvoidmain(String[]args){CoffeecoffeenewSimpleCoffee();coffeenewMilkDecorator(coffee);// 动态叠加加奶coffeenewSugarDecorator(coffee);// 动态叠加再加糖System.out.println(coffee.make());// 输出基础咖啡 加奶 加糖}}你会发现SimpleCoffee不需要改MilkDecorator、SugarDecorator都只关心“自己要增加的部分”组合方式由客户端灵活决定6. 优缺点6.1 优点比继承更灵活不必为了每个组合创建大量子类可组合、可动态启用/禁用运行时自由叠加职责符合开闭原则新增功能通常只加新的装饰器类不改原类6.2 缺点装饰层级可能过多组合复杂时调用链会变长调试/排查问题更复杂因为行为来自一串包装层过度使用会让结构“绕”简单场景可能不需要装饰器7. 和模板方法模式对比7.1 都能“增强行为”但侧重点不同模板方法Template Method强调“固定流程骨架 子类替换步骤”装饰器Decorator强调“对象被包装 运行时叠加职责”可以这样记忆模板方法改的是“流程里的某些步骤继承替换”装饰器改的是“对象外面加了什么功能包装叠加”7.2 谁来控制流程模板方法父类控制流程顺序骨架算法装饰器调用沿着包装链传递谁在外层谁先/后增强顺序可控8. 和代理模式或外观模式的区别8.1 装饰器 vs 代理两者都“包装一个对象”但意图不同代理模式核心目标通常是控制访问/管理远程/延迟加载/权限比如懒加载真实对象、权限校验、记录谁访问了它装饰器模式核心目标是增强功能/增加职责比如日志、加糖加奶、加校验、加缓存等“附加行为”简单判断你包装它是为了“替你去做访问控制/转发到真实对象” → 更像代理你包装它是为了“在同一对象能力上继续加功能” → 更像装饰器8.2 装饰器 vs 外观外观模式把复杂系统封装成一个简单入口“统一门面”装饰器模式多层可组合地给单个对象“叠加职责”9. 总结装饰器模式的核心可以概括为一句话用包装Decorator在不修改原对象的前提下运行时动态叠加额外职责。它适合功能可组合且组合种类多希望减少继承导致的爆炸希望运行时决定增强哪些能力

相关文章:

【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景

文章目录前言1. 装饰器模式是什么?2. 装饰器模式解决什么问题?3. 实现步骤4. 静态结构4.1 抽象组件:Coffee(统一接口)4.2 具体组件:SimpleCoffee(基础咖啡)4.3 装饰器抽象类&#xf…...

效率倍增:用快马平台一键生成带反爬优化策略的clawx脚本

提升爬虫效率的实战心得:用clawx应对反爬机制 最近在做一个数据采集项目时,遇到了不少反爬问题。目标网站不仅会检测请求频率,还会检查请求头信息,甚至有些页面会根据访问行为动态调整返回内容。经过一番摸索,我发现通…...

SR-MPLS BE vs TE实战选择:在华三设备上如何根据业务需求规划最优路径(含HCL实验拓扑)

SR-MPLS路径规划实战:华三设备业务驱动型网络设计指南 当企业网络承载的业务类型日益复杂,从普通的办公OA到关键视频会议、实时交易系统并存时,网络工程师面临的核心挑战在于:如何让网络基础设施智能适配不同业务的服务质量需求&a…...

从B站收藏夹到本地硬盘:3步掌握BiliTools高效下载管理

从B站收藏夹到本地硬盘:3步掌握BiliTools高效下载管理 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 还…...

整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模 整流器模型预测控制mpc仿真三相...

整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模整流器模型预测控制mpc仿真三相三电平npc型整流器有限集模型预测控制fcs-mps,控制目标为跟踪电流和中点电位平衡,有参考文献文章:标题:整流器模型预测控制(MPC…...

百度网盘解析工具终极指南:3分钟告别下载限速困扰

百度网盘解析工具终极指南:3分钟告别下载限速困扰 【免费下载链接】baiduwp-php A tool to get the download link of the Baidu netdisk / 一个获取百度网盘分享链接下载地址的工具 项目地址: https://gitcode.com/gh_mirrors/ba/baiduwp-php 还在为百度网盘…...

油冷式电动滚筒设计【含说明书、CAD图纸、SW三维】

油冷式电动滚筒作为带式输送机的核心驱动部件,集电机、减速器与冷却系统于一体,通过内部循环油路实现高效散热与润滑,显著提升设备运行的稳定性与寿命。其核心作用在于将电能转化为机械能,驱动输送带运转,同时利用油液…...

OpenClaw安全配置指南:Qwen3-14b_int4_awq模型权限管理

OpenClaw安全配置指南:Qwen3-14b_int4_awq模型权限管理 1. 为什么需要特别关注OpenClaw的安全配置? 去年夏天,我在调试一个自动整理文档的OpenClaw任务时,不小心让AI助手误删了工作目录下的重要文件。这次经历让我深刻意识到&am…...

如何用Smithbox零基础高效定制魂系游戏:从入门到精通指南

如何用Smithbox零基础高效定制魂系游戏:从入门到精通指南 【免费下载链接】Smithbox Smithbox is a modding tool for Elden Ring, Armored Core VI, Sekiro, Dark Souls 3, Dark Souls 2, Dark Souls, Bloodborne and Demons Souls. 项目地址: https://gitcode.c…...

突破设备限制:解锁Sunshine自托管游戏串流的全场景应用指南

突破设备限制:解锁Sunshine自托管游戏串流的全场景应用指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 价值定位:为什么Sunshine能重新定义游戏串流体验…...

两种方案深度解析:如何免费解锁WeMod专业功能

两种方案深度解析:如何免费解锁WeMod专业功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 游戏玩家常常面临一个困境:想要使用…...

3步精通UndertaleModTool:解锁GameMaker游戏修改全流程

3步精通UndertaleModTool:解锁GameMaker游戏修改全流程 【免费下载链接】UndertaleModTool The most complete tool for modding, decompiling and unpacking Undertale (and other GameMaker games!) 项目地址: https://gitcode.com/gh_mirrors/un/UndertaleModT…...

OpCore-Simplify:颠覆性重构开源系统硬件适配流程,从8小时到30分钟的效率革命

OpCore-Simplify:颠覆性重构开源系统硬件适配流程,从8小时到30分钟的效率革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify …...

忍者像素绘卷惊艳效果:同一角色在横/竖/方三画幅下的电影感构图适配

忍者像素绘卷惊艳效果:同一角色在横/竖/方三画幅下的电影感构图适配 1. 像素艺术的新境界 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,它将传统忍者文化与现代像素艺术完美结合。这款工具最令人惊叹的特点之一,是能够为…...

零基础教程:用BERT文本分割镜像,一键整理杂乱会议记录

零基础教程:用BERT文本分割镜像,一键整理杂乱会议记录 1. 引言:告别混乱的长文本 每次开完会,面对那些密密麻麻、毫无段落之分的会议记录,你是不是也感到头疼?语音转写生成的文本常常连成一片&#xff0c…...

Windows下OpenClaw安装教程:一键部署Kimi-VL-A3B-Thinking镜像

Windows下OpenClaw安装教程:一键部署Kimi-VL-A3B-Thinking镜像 1. 为什么选择OpenClawKimi-VL组合 上周我在整理电脑上的图片素材时,突然冒出一个想法:如果能有个AI助手帮我自动分类这些图片,还能根据内容生成描述文字该多好。经…...

FNF-PsychEngine完全指南:从零开始打造你的音乐游戏

FNF-PsychEngine完全指南:从零开始打造你的音乐游戏 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF-PsychEngine是一款功能强大的Friday Night Funkin开源游…...

终极跨平台资源下载器:如何一键获取视频号、抖音无水印内容

终极跨平台资源下载器:如何一键获取视频号、抖音无水印内容 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否…...

烟花算法(FWA)在优化问题中的实战:与PSO、遗传算法对比,我该选哪个?

烟花算法(FWA)在优化问题中的实战:与PSO、遗传算法对比,我该选哪个? 当面对复杂的优化问题时,算法工程师常常陷入选择困境:粒子群优化(PSO)的快速收敛、遗传算法(GA)的全局搜索能力,还是新兴的烟花算法(FWA…...

保姆级教程:手把手教你用Aruba Instant On APP搞定家庭Wi-Fi(从开箱到上网)

保姆级教程:手把手教你用Aruba Instant On APP搞定家庭Wi-Fi(从开箱到上网) 刚拿到Aruba Instant AP时,我盯着那个白色小盒子发了十分钟呆——作为一个连路由器都没碰过的纯小白,这玩意儿真的能让我家Wi-Fi快起来&…...

【深度学习OFDM信号处理】Deep-Waveform:基于复值神经网络的端到端OFDM接收机设计与实现【附MATLAB/Python代码】

1. 为什么需要深度学习处理OFDM信号? 传统OFDM接收机依赖离散傅里叶变换(DFT)进行时频域转换,这种固定算法在面对复杂无线环境时存在明显局限。我在实际项目中遇到过这样的情况:当信道出现严重多径衰落时,传…...

避坑指南:ShardingSphere引入后SpringBoot启动变慢的3种常见原因及解决方案

ShardingSphere集成SpringBoot启动优化实战:从原理到解决方案 最近在技术社区看到不少开发者反馈,SpringBoot项目引入ShardingSphere后启动时间明显变长。这确实是个值得深入探讨的问题——作为分布式数据库中间件的标杆产品,ShardingSphere的…...

5个高效技巧:Plus Jakarta Sans开源字体全方位应用指南

5个高效技巧:Plus Jakarta Sans开源字体全方位应用指南 【免费下载链接】PlusJakartaSans Jakarta Sans is a open-source fonts. Designed for Jakarta "City of collaboration" program in 2020. 项目地址: https://gitcode.com/gh_mirrors/pl/PlusJa…...

2026最权威的十大降AI率工具横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 凭借人工智能技术来辅助撰写开题报告,能极大程度显著提升文献梳理以及框架搭建的…...

2026届毕业生推荐的AI辅助写作网站实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 身为智能写作辅助工具的DeepSeek,于学术论文创作里呈现出明显效能,用…...

3步解决Windows苹果设备连接难题:开源工具Apple-Mobile-Drivers-Installer使用指南

3步解决Windows苹果设备连接难题:开源工具Apple-Mobile-Drivers-Installer使用指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址:…...

7个实用技巧让你轻松掌握E-Hentai漫画下载与管理

7个实用技巧让你轻松掌握E-Hentai漫画下载与管理 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 漫画下载痛点与解决方案 作为漫画爱好者,你是否遇到过这些…...

【带AI】基于SpringBoot+Vue美食推荐系统设计与实现+文档+指导搭建视频

特色采用前后端分离架构。系统通过分析用户行为数据(浏览历史、收藏、评价),运用混合推荐算法为用户智能推荐美食。支持美食打卡、社交评价、AI聊天助手等功能,集成智谱AI提供智能美食咨询服务。技术栈后端:Spring Boo…...

Pytorch自动微分模块:从原理到实战,解锁反向传播核心奥秘

Pytorch自动微分模块:从原理到实战,解锁反向传播核心奥秘一、核心认知:自动微分,深度学习的求导"神器"1.1 自动微分的核心价值1.2 核心公式:参数更新的底层逻辑(1)权重更新公式&#…...

如何使用 ECharts 绘制 K 线图

在金融数据可视化领域,K 线图(又称蜡烛图)是展示股票、期货等价格走势的核心工具。它通过矩形实体和上下影线直观呈现开盘价、收盘价、最高价和最低价,帮助投资者快速捕捉市场趋势。本文将结合 ECharts 的官方文档和实战案例&…...