前言
在学习 Java IO 的时候,记得头几回看到下面的代码,总是有点纳闷:
InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
这个代码,首先创建一个 FileInputStream 的对象,然后再传入到 BufferedInputStream 中,这是要干什么,为什么要这么做。
现在回过头来想,当时出现这些疑惑大部分原因是由于:
- 对于 Java IO的 stream 不熟悉。实际上比较常用的还有 DataInputStream,ObjectInputStream,FilterInputStream 等。
- 没有认识 装饰器模式。如果认识了装饰器模式,那么这些代码会很好理解了。
装饰器模式
作用与好处
装饰器模式 主要用于为对象动态的添加功能。比如说,最简单的 IO 使用可能是如下代码:
InputStream inputStream = new FileInputStream(filePath);
但是我们发现,这个代码 每次进行读取都会进行 一次 IO,IO是比较耗费时间的。 那么有没有什么方法降低 IO 次数呢,自然想到了缓冲。那么此时有两种做法:
- 定义一个 专门用于缓冲的文件读写 stream。
- 为 FileInputStream 类进行扩展,让它支持 缓冲。
肯定是第二种好,为什么呢。因为如果你按照1方案,
假如我要定义一个支持X功能,此时要定义一个 专门用于这个功能的stream,这个没有问题;
假如我又要定义一个支持Y功能,此时要定义一个专门用于这个功能的stream,这个也没有问题;
但是,假如我要定义一个 同时支持 X,Y功能,由于不能扩展,所以你必须再定义一个类,同时支持X,Y功能。这个就有问题了,问题就是重复了。
但是,2 方案就能解决这个问题, 2方案中当你需要一个同时支持 X,Y 功能的类,那你动态扩展便是了,不用再新定义一个类,同时支持XY。
这个就是装饰器模式的好处。