什么是装饰器模式(What)
动态的给一个对象添加一些额外的职责
为什么使用装饰器模式(Why)
继承方案会导致继承结构复杂,不易维护等问题,因此使用组合代替继承,给原始类添加增强功能
怎样使用装饰器模式(How)
装饰器类需要和原始类继承相同的抽象类或者实现相同的接口
下面以JDK中的IO举例:
//抽象类输入流
public abstract class InputStream {
public abstract int read() throws IOException;
public void close() throws IOException {}
}
//实现InputStream中的所有方法,让其子类按需要覆盖方法,并且还可以提供附加的方法或字段。
public class FilterInputStream extends InputStream {
protected volatile InputStream in;
protected FilterInputStream(InputStream in) {
this.in = in;
}
public int read() throws IOException {
return in.read();
}
public void close() throws IOException {
in.close();
}
}
//装饰器类都继承FilterInputStream,可以增强自己想要增强的功能
public class CheckedInputStream extends FilterInputStream {
public CheckedInputStream(InputStream in, Checksum cksum) {
super(in);
this.cksum = cksum;
}
public int read() throws IOException {
int b = in.read();
if (b != -1) {
cksum.update(b);
}
return b;
}
}