装饰器模式:
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
java例子:
下面是java中I/O使用的例子
//FilterInputStream
public class FilterInputStream extends InputStream {
protected volatile InputStream in;
protected FilterInputStream(InputStream in) {
this.in = in;
}
public int read() throws IOException {
return in.read();
}
......
}
//BufferedInputStream
public class BufferedInputStream extends FilterInputStream {
public BufferedInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE);
}
public synchronized int read() throws IOException {
if (pos >= count) {
fill();
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 0xff;
}
......
}
- FileInputStream实现了InputSteam所有接口,并且持有InputStream对象实例的引用;
- BufferedInputStream是具体的装饰器实现者,它给InputSteam类附加了功能,这个装饰器类的作用就是使得InputStream读取的数据保存在内存中,提高读取性能。
适配器模式和装饰器模式区别联系:
- 适配器和装饰器模式都有一个别名就是包装模式,它们看似都是起到包装一个类或对象的作用;
- 适配器模式的意义是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的;
- 装饰器模式不是要改变被装饰对象的接口,而是要保持原有接口,但是增强原有对象的功能,或改变原有对象的处理方法而提升性能。