模式概述
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有对象动态添加新功能,同时又不改变其结构。这种模式创建了一个装饰类,用于包装原有的类,提供了比继承更有弹性的替代方案。
核心思想:通过组合而非继承的方式,在运行时动态地扩展对象功能,遵循"开闭原则"(对扩展开放,对修改关闭
简单代码示例
java
// 1. 抽象构件
interface DataSource {
void writeData(String data);
String readData();
}
// 2. 具体构件
class FileDataSource implements DataSource {
private String filename;
public FileDataSource(String filename) {
this.filename = filename;
}
@Override
public void writeData(String data) {
System.out.println("Writing data to file: " + data);
}
@Override
public String readData() {
return "Data from file";
}
}
// 3. 抽象装饰类
abstract class DataSourceDecorator implements DataSource {
protected DataSource wrappee;
public DataSourceDecorator(DataSource source) {
this.wrappee = source;
}
}
// 4. 具体装饰类 - 加密装饰器
class EncryptionDecorator extends DataSourceDecorator {
public EncryptionDecorator(DataSource source) {
super(source);
}
@Override
public void writeData(String data) {
String encrypted = encrypt(data);
wrappee.writeData(encrypted);
}
@Override
public String readData() {
String data = wrappee.readData();
return decrypt(data);
}
private String encrypt(String data) {
return "ENCRYPTED(" + data + ")";
}
private String decrypt(String data) {
return data.replace("ENCRYPTED(", "").replace(")", "");
}
}
// 5. 具体装饰类 - 压缩装饰器
class CompressionDecorator extends DataSourceDecorator {
public CompressionDecorator(DataSource source) {
super(source);
}
@Override
public void writeData(String data) {
String compressed = compress(data);
wrappee.writeData(compressed);
}
@Override
public String readData() {
String data = wrappee.readData();
return decompress(data);
}
private String compress(String data) {
return "COMPRESSED[" + data + "]";
}
private String decompress(String data) {
return data.replace("COMPRESSED[", "").replace("]", "");
}
}
// 客户端代码
public class DecoratorDemo {
public static void main(String[] args) {
// 基本文件数据源
DataSource source = new FileDataSource("data.txt");
// 添加加密功能
DataSource encryptedSource = new EncryptionDecorator(source);
encryptedSource.writeData("Sensitive data");
System.out.println("Read encrypted: " + encryptedSource.readData());
// 添加压缩和加密功能
DataSource secureSource = new CompressionDecorator(
new EncryptionDecorator(source));
secureSource.writeData("Large sensitive data");
System.out.println("Read compressed & encrypted: " + secureSource.readData());
}
}
技术细节
1.模式组成
组件 | 职责说明 |
---|---|
抽象构件 | 定义对象接口,可以动态添加职责 |
具体构件 | 实现Component接口,定义要添加功能的对象 |
抽象装饰类 | 继承Component,维护一个Component对象的引用 |
具体装饰类 | 向构件添加具体职责 |
2.优缺点
优点:
- 比继承更灵活,符合开闭原则,无需修改现有代码
- 支持运行时动态添加或移除功能
缺点:
- 会产生大量小对象,增加系统复杂性
- 多层装饰时调试困难
模式应用
I/O流是装饰器模式的完美范例,它通过装饰器模式为基本的I/O操作提供了灵活而强大的扩展能力