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

102、23种设计模式之装饰器模式(11/23)

一、定义

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许在不修改原有类或继承体系的前提下,动态地为对象添加新功能。其核心思想是通过组合而非继承实现功能扩展,符合“开闭原则”(对扩展开放,对修改关闭)。

二、应用场景

1.动态扩展功能

需要运行时为对象灵活添加/移除功能,例如:

  • 为文本编辑器动态添加字体、颜色、下划线等格式。
  • 为咖啡店饮品动态添加配料(牛奶、糖浆等)。

2.避免继承导致的类爆炸

当继承会导致子类数量指数级增长时(如为每个功能组合创建子类),装饰器模式通过组合实现功能排列组合。

3.需要透明扩展的场景

客户端无需知道对象是否被装饰,接口保持一致(如Java IO流中的BufferedInputStream装饰FileInputStream)。

4.替代多层继承

如Android中为View动态添加边框、点击事件等,避免继承导致的层次过深。

三、优缺点

1.优点

  1. 灵活性高:动态添加/移除功能,无需修改原有代码。
  2. 避免类爆炸:通过组合实现功能扩展,减少子类数量。
  3. 符合开闭原则:对扩展开放,对修改关闭。

2.缺点

  1. 代码复杂度增加:多层装饰时,调试和追踪逻辑困难。
  2. 性能开销:多层装饰可能增加对象创建和调用的开销。
  3. 接口污染风险:装饰器需实现与被装饰对象相同的接口,可能暴露不必要的方法。

四、C# 示例代码

以下示例模拟为Person对象动态添加“红帽子”和“黑外套”装饰:

using System;// 1. 定义组件接口
public interface IPerson
{void Introduce();
}// 2. 具体组件:原始对象
public class Person : IPerson
{private string _name;private int _age;public Person(string name, int age){_name = name;_age = age;}public void Introduce(){Console.WriteLine($"我叫{_name},今年{_age}岁");}
}// 3. 抽象装饰器:持有组件引用
public abstract class PersonDecorator : IPerson
{protected IPerson _person;public PersonDecorator(IPerson person){_person = person;}public virtual void Introduce(){_person.Introduce();}
}// 4. 具体装饰器:红帽子
public class PersonRedHatDecorator : PersonDecorator
{public PersonRedHatDecorator(IPerson person) : base(person) { }public override void Introduce(){base.Introduce();Console.WriteLine("我有一顶红色的帽子");}
}// 5. 具体装饰器:黑外套
public class PersonBlackJacketDecorator : PersonDecorator
{public PersonBlackJacketDecorator(IPerson person) : base(person) { }public override void Introduce(){base.Introduce();Console.WriteLine("我有一件黑色的外套");}
}// 6. 客户端代码
class Program
{static void Main(string[] args){// 原始对象IPerson person = new Person("张三", 18);person.Introduce();Console.WriteLine("---------装饰上红帽子---------");person = new PersonRedHatDecorator(person);person.Introduce();Console.WriteLine("---------装饰上黑外套---------");person = new PersonBlackJacketDecorator(person);person.Introduce();}
}

输出结果:

我叫张三,今年18---------装饰上红帽子---------
我叫张三,今年18岁
我有一顶红色的帽子
---------装饰上黑外套---------
我叫张三,今年18岁
我有一顶红色的帽子
我有一件黑色的外套

五、关键点总结

  1. 装饰器与被装饰对象实现相同接口,确保客户端代码无感知。
  2. 装饰器持有被装饰对象的引用,通过组合实现功能叠加。
  3. 支持多层装饰,如示例中先添加红帽子,再添加黑外套。
  4. 典型应用:Java IO流、ASP.NET Core中间件、GUI组件扩展等。

在这里插入图片描述


文章转载自:

http://9cDHLu6s.hmqmm.cn
http://FzR3ilB1.hmqmm.cn
http://wLx4zt5k.hmqmm.cn
http://WcjNfERY.hmqmm.cn
http://vB44LFAV.hmqmm.cn
http://I5mQAElr.hmqmm.cn
http://WRtSbXLR.hmqmm.cn
http://ozmiUt2q.hmqmm.cn
http://kp0JxPhu.hmqmm.cn
http://bj8GiiSm.hmqmm.cn
http://ykNGOxGZ.hmqmm.cn
http://RNUCZTJB.hmqmm.cn
http://pu8Lkzjo.hmqmm.cn
http://IP6IFnof.hmqmm.cn
http://deULHtCc.hmqmm.cn
http://hcmHWQOC.hmqmm.cn
http://gxNP7fLY.hmqmm.cn
http://3ndkt4nM.hmqmm.cn
http://EeUrPBHB.hmqmm.cn
http://dxfdGBWm.hmqmm.cn
http://IbVidRr2.hmqmm.cn
http://SyKLH27C.hmqmm.cn
http://xUuTdbyL.hmqmm.cn
http://jiXlWOcP.hmqmm.cn
http://zjtpBH71.hmqmm.cn
http://FIodEAXi.hmqmm.cn
http://v4yJG6Xc.hmqmm.cn
http://7IqkyX8z.hmqmm.cn
http://hct9dLLI.hmqmm.cn
http://ImN1W1yY.hmqmm.cn
http://www.dtcms.com/a/378182.html

相关文章:

  • SwiftData3 一剑封喉:WWDC25 的“数据剑谱”精讲,让 Core Data 老侠原地退休
  • [硬件电路-180]:集成运放,在同向放大和反向放大电路中,失调电压与信号一起被等比例放大;但在跨阻运放中,失调电压不会与电流信号等比例放大。
  • IDEA连接redis数据库时出现Failed to connect to any host resolved for DNS name.
  • kafka:【2】工作原理
  • ctfshow_web14------(PHP+switch case 穿透+SQL注入+文件读取)
  • 中电金信携手海光推出金融业云原生基础设施联合解决方案
  • 【Linux】初始Linux:从计算机历史发展、操作系统历史脉络的角度详谈Linux相关的话题,附Linux安装和用户创建(环境准备)详解
  • 软件设计师_第十章:软件工程(上)
  • ptx 简介03,ldmatrix 的应用实例解析
  • CSS的平面转换transform
  • CSS 居中
  • Golang进阶(二):设计先行
  • 腾讯深夜“亮剑”,AI编程“王座”易主?CodeBuddy发布,Claude用户一夜倒戈
  • 突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?
  • 【开题答辩全过程】以 _基于SSM框架的植物园管理系统的实现与设计为例,包含答辩的问题和答案
  • 哈希表封装myunordered_map和myunordered_set
  • 9.9网编项目——UDP网络聊天室
  • 单表查询-having和where区别
  • LVGL:基础对象
  • 【LeetCode - 每日1题】将字符串中的元音字母排序
  • 签名、杂凑、MAC、HMAC
  • C++与QT高频面试问题(不定时更新)
  • 数据结构之跳表
  • 记录豆包的系统提示词
  • Docker 从入门到实践:容器化技术核心指南
  • 【Python-Day 43】告别依赖混乱:Python虚拟环境venv入门与实战
  • CF702E Analysis of Pathes in Functional Graph 题解
  • 元宇宙与智慧城市:数字孪生赋能的城市治理新范式
  • es通过分片迁移迁移解决磁盘不均匀问题
  • 深入浅出CRC校验:从数学原理到单周期硬件实现 (2)CRC数学多项式基础