- 目的 : 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
- 核心 : 定义一个装饰器类,它也实现被装饰对象的接口,并持有该对象的引用。可以在调用被装饰对象的方法前后添加新行为。可以嵌套装饰。
- 场景 : I/O 流处理、GUI 组件装饰、权限控制
首先有一个接口, 定义了读取的基本操作
java
package decorator;
public interface IReader {
void read();
}
然后有一个被装饰的类,实现了基本的读取功能,是被装饰的原始对象
package decorator;
public class Reader implements IReader {
@Override
public void read() {
// 被装饰类原有的核心业务逻辑
System.out.println("被装饰的类原本的逻辑");
}
}
最后就是装饰器类,实现了IReader接口,用于增强原有读取器的功能
java
package decorator;
public class BufferedReader implements IReader {
private IReader mReader; // 持有被装饰对象的接口引用
public BufferedReader(IReader reader) {
this.mReader = reader;
}
@Override
public void read() {
// 装饰器新增的功能:在原有逻辑前后添加额外处理
System.out.println("使用装饰器实现其他逻辑"); // 增强逻辑:前置处理
mReader.read(); // 调用被装饰对象的原有方法,保持核心功能
// 这里还可以添加后置处理逻辑
}
}
函数入口
java
package decorator;
public class MainTest {
public static void main(String[] args) {
// 创建被装饰的原始对象
Reader reader = new Reader();
reader.read();
System.err.println("--------");
// 使用装饰器包装原始对象,增强其功能
BufferedReader reader2 = new BufferedReader(reader);
reader2.read();
}
}
