🔍 一、模式定义
装饰器模式(Decorator Pattern)是一种结构型设计模式,通过组合(而非继承)动态扩展对象功能,保持接口一致性且遵循开闭原则。其核心思想是运行时功能叠加,典型应用包括Java I/O流体系(如BufferedInputStream
包装FileInputStream
)。
🧩 二、核心角色
角色 | 职责 | 示例 |
---|---|---|
Component | 定义被装饰对象的抽象接口(如InputStream ) | Coffee 接口 |
ConcreteComponent | 实现基础功能的具体类(如FileInputStream ) | SimpleCoffee 类 |
Decorator | 持有Component 引用并实现其接口的抽象装饰类 | CoffeeDecorator 抽象类 |
ConcreteDecorator | 添加具体扩展功能(如加密、缓冲等) | MilkDecorator 类 |
⚙️ 三、实现原理
-
基础结构
装饰器与被装饰对象实现相同接口,通过嵌套包装实现功能叠加:// 抽象组件 interface DataSource { void writeData(String data); String readData(); } // 具体组件 class FileDataSource implements DataSource { // 基础实现... } // 抽象装饰器 abstract class DataSourceDecorator implements DataSource { protected DataSource wrappee; public DataSourceDecorator(DataSource source) { this.wrappee = source; } } // 具体装饰器:加密功能 class EncryptionDecorator extends DataSourceDecorator { @Override public void writeData(String data) { wrappee.writeData(encrypt(data)); // 功能增强 } private String encrypt(String data) { /*...*/ } }
-
客户端调用
通过多层嵌套实现功能组合:Coffee coffee = new SugarDecorator(new MilkDecorator(new SimpleCoffee())); System.out.println(coffee.getDescription()); // 输出:"咖啡 + 牛奶 + 糖"
🌟 四、模式优势
- 灵活扩展:动态添加/撤销功能,避免继承导致的子类爆炸。
- 透明性:装饰后对象与原对象接口一致,客户端无感知。
- 符合开闭原则:无需修改原有代码即可扩展功能。
⚠️ 五、适用场景
- 需要动态扩展功能(如为咖啡添加调料、为数据流增加缓冲)。
- 无法使用继承(如final类或需多维度扩展)。
- 避免复杂子类层次(如GUI组件样式组合)。
🔄 六、与其他模式对比
对比项 | 装饰器模式 | 代理模式 |
---|---|---|
目的 | 增强对象功能 | 控制对象访问(如延迟加载、权限校验) |
调用关系 | 装饰器调用被装饰对象 | 代理类隐藏真实对象实现 |
典型应用 | Java I/O流、Spring AOP增强 | MyBatis Mapper代理、RPC远程调用 |
📌 七、注意事项
- 避免过度装饰:多层嵌套可能降低代码可读性和性能。
- 与继承的权衡:简单功能扩展可直接用继承,复杂组合场景用装饰器。
- 接口一致性:确保所有装饰器实现统一接口,否则会破坏透明性。
通过合理使用装饰器模式,可显著提升代码的扩展性和维护性,尤其在需要动态功能组合的场景中优势明显。