设计模式初探(六)之修饰者
通过介绍java.io来介绍Decorator。
?
?
老的jdk版本中只有面向字节操作的io,大家熟知的Stream。面向字节io中的输入类都是继承自InputStream,它是个抽象类,声明了基本的read操作,用于返回io中的字节(其每个子类中的read操作其实都是本地方法实现,用到了native关键字),下面是我从网上down的关于InputStream的基本结构图:

?
所谓修饰是给对象增加额外的职责,但是又不影响其自身的功能,比如在FileInputStream是给一个file对象建立一个输入流,但也仅仅是一个file输入流,没有缓存,没有特殊的读取服务,如果在其上调用read方法:
publicclass FilterInputStream extends InputStream { /** * The input stream to be filtered. */ protected volatile InputStream in; protected FilterInputStream(InputStream in) {this.in = in; } public int read() throws IOException {return in.read(); }?FilterInputStream称为修饰器,即它可以用来修饰其它的流,增加职能,它有若干个子类用来对每一种职能进行代码实现,FilterInputStream会封装一个它的父类(InpuStream)类型的对象,在构造器中将需要进行修饰的对象(这里是流)赋值给这个封装的对象,并且每一个重写的方法都是委托给这个对象进行,在前后加上需要处理的其它逻辑比如缓存或者是数据压缩,这其实在实际运行的过程中是一个递归的过程,BufferedInputStream中的操作传递给DataInputStream,再传递给FileInputStream,然后从其中跳转出来到DataInputStream中对读取的数据进行格式的判断和选择转换,最后对处理完毕的数据进行byte数组缓存。
?
想到这里,我觉得在数据库连接的实现中也可以考虑用到修饰模式,很不错的模式。