《图解设计模式》在讲解装饰器模式时,使用了一段非常不错的描述:
假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果再加上草莓,它就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力协商姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕。
其实说到底,无论加上什么修饰,本质还是蛋糕,只是加上修饰之后,蛋糕生产的意义就更加明确。
JAVA中IO流是典型的使用修饰器模式的设计,如InputStream.java、OutputStream.java以及它们的子类等。从设计模式层面去理解IO包,有助于快速地对源码进行阅读和理解
类图
InputStream
public abstract class InputStream implements Closeable{
public abstract int read() throws IOException;
public void close() throws IOException {};
...
}
FileInputStream
public
class FileInputStream extends InputStream
{
// 若干属性
private final String path;
private FileChannel channel = null;
...
// 继承InputStream的方法
public int read() throws IOException {
return read0();
}
...
// 若干独有的方法
public final FileDescriptor getFD() throws IOException {
if (fd != null) {
return fd;
}
throw new IOException();
}
...
}
ObjectInputStream
public class ObjectInputStream
extends InputStream implements ObjectInput, ObjectStreamConstants
{
// 若干属性
private final BlockDataInputStream bin;
private final ValidationList vlist;
...
// 继承InputStream的方法
public int read() throws IOException {
return bin.read();
}
...
// 若干独有的方法
public final Object readObject()
throws IOException, ClassNotFoundException
{
if (enableOverride) {
return readObjectOverride();
}
...
}
...
}