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

设计模式-装饰器模式

装饰器模式

装饰器模式(Decorator Pattern)详解

一、模式概述

装饰器模式是一种结构型设计模式,它允许动态地将新功能附加到现有对象上,同时不改变其结构。相比继承,装饰器模式提供了更灵活的扩展方式。

就像给咖啡加糖、加奶,在不改变咖啡本身的情况下,动态增加新特性。

二、模式结构

1. 核心角色

text

┌─────────────────┐ │ Component │ (抽象组件) │ (接口/抽象类) │ └────────┬────────┘ ▲ │ ┌────────┴────────┐ ┌─────────────────┐ │ ConcreteComponent│ │ Decorator │ │ (具体组件) │◄─────│ (抽象装饰器) │ └──────────────────┘ └────────┬────────┘ ▲ │ ┌────────────────┼────────────────┐ │ │ │ ┌────────┴────────┐ ┌─────┴───────┐ ┌─────┴───────┐ │ConcreteDecoratorA│ │ConcreteDecoratorB│ │ConcreteDecoratorC│ │ (具体装饰器A) │ │ (具体装饰器B) │ │ (具体装饰器C) │ └─────────────────┘ └─────────────────┘ └─────────────────┘
2. 角色职责
角色名称职责
Component抽象组件定义对象接口,可以动态添加职责
ConcreteComponent具体组件被装饰的原始对象
Decorator抽象装饰器持有Component引用,实现Component接口
ConcreteDecorator具体装饰器负责给Component添加额外功能

三、基础实现示例

咖啡订单系统

java

// 1. 抽象组件:饮品 interface Beverage { String getDescription(); double cost(); } // 2. 具体组件:咖啡 class Coffee implements Beverage { @Override public String getDescription() { return "咖啡"; } @Override public double cost() { return 20.0; } } // 3. 抽象装饰器 abstract class BeverageDecorator implements Beverage { protected Beverage beverage; public BeverageDecorator(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription(); } @Override public double cost() { return beverage.cost(); } } // 4. 具体装饰器:牛奶 class Milk extends BeverageDecorator { public Milk(Beverage beverage) { super(beverage); } @Override public String getDescript
http://www.jsqmd.com/news/488269/

相关文章:

  • Go语言开发的my2sql vs Python版binlog2sql:性能对比与选型指南
  • FireRed-OCR Studio保姆级教程:日志监控、性能分析与GPU利用率可视化
  • 手搓一个龙虾openClaw,window 安装教程
  • 七彩光轨重构仓储未来:智能寻物拣货系统的效率革命
  • 通义千问2.5-7B必装插件推荐:提升部署效率的5个工具
  • django基于深度学习的旅游推荐系统
  • 为什么我推荐在CentOS7上使用Python 3.12.7?性能对比与升级全攻略
  • SGLang-v0.5.6实战效果:工单处理延迟降低58%,吞吐量翻倍
  • Qwen3-14B企业级应用解析:从合同审查到报告总结的实战落地
  • CLIP-GmP-ViT-L-14效果对比评测:与传统图像检索算法的性能差异
  • AI原生企业的本质:从辅助工具到产业基因的跃迁
  • 用C语言手搓可视化排序算法:从冒泡到堆排序的10种实现(附完整代码)
  • springboot基于微信小程序的共享办公室在线预约与租赁系统的设计与实现-
  • 【AI大模型教程】GLM-TTS快速上手指南:从安装到生成,手把手教你做AI配音
  • Phi-3-Mini-128K模型服务化部署:使用Docker容器化与API封装
  • 幻境·流金BF16混合精度实操:适配A10/H100的高性能推理环境配置详解
  • 网络:6.传输层协议UDP
  • RexUniNLU中文NLU部署白皮书:从单机开发到K8s集群的可扩展架构
  • Qwen3-ASR-0.6B语音识别入门必看:自动语言检测+多格式音频支持详解
  • cv_unet_image-colorization快速部署:本地运行,隐私安全无网络依赖
  • 运维必备神器:Linux pv 命令详解(大文件进度条神器)
  • 【2026开发者生存预警】:VSCode跨端调试不再兼容旧插件——3类项目必须在Q2前完成迁移
  • 5个维度解析Lightpanda:轻量级高效无头浏览器的技术实践与价值
  • MusePublic-SDXL实战教程:生成可商用的CC0协议艺术素材方法
  • Z-Image-Turbo极速创作室新手指南:避开这些坑,快速出好图
  • AI智慧高光谱遥感实战-暨手撕99个案例项目、全覆盖技术链与应用场景一站式提升方案
  • 3大核心优势让itch.io桌面应用成为独立游戏玩家的必备工具
  • 攻克biliTickerBuy运行难题:开源抢票工具全方案解决指南
  • 首次学习markdown
  • SAP ALV表格编辑保存全攻略:从LVC_S_GLAY-EDT_CLL_CB字段到数字字段处理技巧