装饰器模式(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()); // 输出:"咖啡 + 牛奶 + 糖"
对比项 | 装饰器模式 | 代理模式 |
---|---|---|
目的 | 增强对象功能 | 控制对象访问(如延迟加载、权限校验) |
调用关系 | 装饰器调用被装饰对象 | 代理类隐藏真实对象实现 |
典型应用 | Java I/O流、Spring AOP增强 | MyBatis Mapper代理、RPC远程调用 |
通过合理使用装饰器模式,可显著提升代码的扩展性和维护性,尤其在需要动态功能组合的场景中优势明显。