GoF设计模式——装饰器模式
h5打开以查看为什么需要装饰器模式?假设经营一家咖啡店,有基础咖啡和浓缩咖啡两种基底。顾客可以加牛奶、加糖、加珍珠……如果用继承来实现每一种组合,会得到MilkCoffee、SugarCoffee、MilkSugarCoffee、PearlMilkCoffee……每增加一种配料,类的数量就会翻倍。这就是组合爆炸问题。继承是静态的,编译时就确定了功能组合。但现实中,顾客的需求是动态的——今天加珍珠明天不加,同一个人上午要牛奶下午要燕麦奶。需要一种机制,能在运行时灵活地给对象"叠加"功能,而不是提前把所有组合都写死。装饰器模式正是为此而生:通过组合而非继承,在运行时动态地给对象添加额外功能。被装饰的对象和装饰器实现相同的接口,客户端完全感知不到自己拿到的是原始对象还是被层层包装后的对象。概念装饰器模式Decorator Pattern是一种结构型设计模式,核心思想是在不改变对象接口的前提下,动态地为对象添加额外职责。装饰器模式通过将原始对象放入一个"包装器"(装饰器)中来实现功能增强。装饰器与被装饰对象实现相同的接口,因此可以层层嵌套,形成一条装饰链。装饰器模式的主要角色有:Component(组件):定义组件和装饰器共同实现的抽象接口ConcreteComponent(具体组件):被装饰的原始对象,实现 Component 接口Decorator(装饰器):持有 Component 引用的抽象类,实现 Component 接口,将所有调用委托给被装饰对象ConcreteDecorator(具体装饰器):在委托调用的基础上添加新功能ConcreteComponent 是被装饰的原始对象。Decorator 持有一个 Component 引用(可以是 ConcreteComponent,也可以是已经被其他装饰器包装过的对象),并将调用委托给它。ConcreteDecorator 在委托前后添加自己的行为。由于装饰器本身也实现 Component 接口,所以可以层层嵌套,形成装饰链。可以把装饰器模式理解为穿衣服:人(ConcreteComponent)是基础,穿上 T 恤(ConcreteDecoratorA)是第一层装饰,再套上外套(ConcreteDecoratorB)是第二层。每加一层衣服,整体的"功能"就多一层(保暖、防风、好看),但人还是那个人,衣服之间也可以自由搭配、随意增减。实现基础实现装饰器模式的标准实现分为以下几个步骤:定义 Component 接口,声明组件和装饰器共同实现的方法实现 ConcreteComponent,提供基础功能定义 Decorator 抽象类,持有 Component 引用并委托调用实现 ConcreteDecorator,在委托前后添加新功能// 步骤1:定义组件接口 interface Component { void operation(); } // 步骤2:实现具体组件 class ConcreteComponent implements Component { public void operation() { System.out.println("基础功能"); } } // 步骤3:定义抽象装饰器 abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); // 委托给被装饰对象 } } // 步骤4:实现具体装饰器 class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); // 先调用被装饰对象的功能 System.

相关新闻

TL431调压原理深度解析:从内部结构到开关电源实战应用

TL431调压原理深度解析:从内部结构到开关电源实战应用

1. 从“基准”到“万能”:TL431的江湖地位在模拟电路的世界里,有一个其貌不扬、价格低廉、却几乎无处不在的“三脚”芯片,它就是TL431。如果你拆开任何一个开关电源、线性稳压器或者电池充电器,十有八九能在反馈回路里找到它的身影…

2026/10/10 10:52:57 阅读更多 →
如何避免 Claude API Key 散落在代码仓库

如何避免 Claude API Key 散落在代码仓库

在接入 Claude API 的项目中,很多团队真正容易踩坑的地方,其实不是模型怎么调用,而是 Claude API Key 怎么管理。一个 API Key 如果不小心提交到了公开仓库,或者被复制到 Issue、贴进在线调试工具、写死在配置文件里,就…

2026/10/10 20:26:29 阅读更多 →
2026年养车实用攻略 汇总变速箱油更换性价比高的优质门店

2026年养车实用攻略 汇总变速箱油更换性价比高的优质门店

各位柳州尤其是融水的车主朋友们,是不是一到要换变速箱油的节点就犯愁:怕买到假油、怕工时费乱收、怕换完反而出顿挫故障?我最近整理了2025年全年收到的120多份车主养护反馈,加上半个月的线下实测比对,整理出这份性价比…

2026/10/4 21:29:43 阅读更多 →

最新新闻

Shell脚本自动化运维:从重复命令到无人值守

Shell脚本自动化运维:从重复命令到无人值守

凌晨一点半,手机在床头柜上震动起来。我眯着眼看了一眼,是某个项目服务器的磁盘告警通知。爬起来打开电脑,SSH到机器上敲了两行命令,确认是日志文件把分区撑满了,清理完,再回到床上,睡意已经被折…

2026/10/10 21:33:19 阅读更多 →
快播影音盒源码搭建与优化:PHP影音建站系统实战指南

快播影音盒源码搭建与优化:PHP影音建站系统实战指南

简介:这份快播影音盒源码面向对P2P流媒体播放技术感兴趣的多媒体开发者与网络编程学习者,聚焦快播播放器的核心实现,涵盖播放界面、媒体资源获取与P2P传输等模块。压缩包共32个文件,约395KB,以frm窗体、bas模块、frx资…

2026/10/10 21:33:19 阅读更多 →
箱体目标检测数据集处理全流程:拆包、转换、YOLO训练与难例挖掘

箱体目标检测数据集处理全流程:拆包、转换、YOLO训练与难例挖掘

简介:箱体目标检测数据集面向物流仓储、工业制造、机器人抓取等场景,提供七百八十三张真实箱体图像及YOLO格式标注,可用于训练多类别目标检测模型。数据包含零与box两个类别,训练、验证、测试集按六百八十七比六十四比三十二划分&…

2026/10/10 21:33:19 阅读更多 →
半年内CSDN连发多篇部署教程:这款2.5亿下载量的嵌入模型正在二次爆火

半年内CSDN连发多篇部署教程:这款2.5亿下载量的嵌入模型正在二次爆火

半年内CSDN连发多篇部署教程:这款2.5亿下载量的嵌入模型正在二次爆火 【免费下载链接】all-MiniLM-L6-v2 项目地址: https://ai.gitcode.com/hf_mirrors/sentence-transformers/all-MiniLM-L6-v2 导读:一款 2021 年的老模型,凭什么在…

2026/10/10 21:33:19 阅读更多 →
基于SSM的校园学生体温管理系统开发全解析

基于SSM的校园学生体温管理系统开发全解析

我在帮学校做学生体温管理系统的时候,刚接手并没有直接想着用什么技术框架,而是需求确实摆在面前:每天上午、下午两轮体温填报,班主任要查看全班数据,校医要盯着异常记录,教务处要统计发热人数。用Excel收上…

2026/10/10 21:33:19 阅读更多 →
Python开发者微信小程序后端实战指南

Python开发者微信小程序后端实战指南

简介:本资源是一份面向Python开发者的微信小程序入门与进阶实践指南,专为熟悉Python但希望拓展前端及全栈能力的工程师设计,解决JavaScript生态切入难、前后端协同不畅等实际问题。文档系统梳理了微信开发者工具配置、WXML/WXSS类比学习路径、…

2026/10/10 21:32:18 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →