装饰器模式

《图解设计模式》在讲解装饰器模式时,使用了一段非常不错的描述:

假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果再加上草莓,它就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力协商姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕。

其实说到底,无论加上什么修饰,本质还是蛋糕,只是加上修饰之后,蛋糕生产的意义就更加明确。

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();
        }
        ...
    }
    ...

}
上一篇:Java 复制文件异常处理方案


下一篇:MultiDex解析