Java IO(九)FilterInputStream 和 FilterOutputStream
Java IO(九)FilterInputStream 和 FilterOutputStream
一、介绍
FilterInputStream 和 FilterOutputStream 是过滤字节输入流和过滤字节输出流。它们的作用是封装其他的基础流,并为它们提供额外的功能。它们的子类分别有:
- 缓冲流:BufferedInputStream 和 BufferedOutputStream
- 数据流:DataInputStream 和 DataOutputStream
- 回退流:PushBackInputStream 和 PushBackOutputStream
二、装饰者模式和继承
装饰者模式,就是将原有的基础流进行"装饰",那么装饰后的方法要与原先被装饰的基础类要保持一致,也可以在对基础流进行扩展。而继承是继承父类的属性和方法,通过重写父类里面的方法也可以起到"装饰"作用,比如强化或者优化父类里面的一些方法。
两者的区别是装饰者模式可以动态地扩展一个对象,给对象添加额外的功能,而且装饰者和被装饰者之间不会产生耦合。
(一)、实现 BufferedInputStream 的功能,采用继承的方式。
如果采用继承的方式,要实现 BufferedInputStream 的功能,我们就必须继承大部分的字节输入流,Java IO中还有其他的如 DataInputStream 等,如果都使用继承方式,那么Java IO 体系会变得很臃肿,而且类与类之间的耦合度特别高。
(二)、实现 BufferedInputStream 的功能,采用装饰者模式。
通过上面的继承方式,通过装饰者模式可以解决继承带来的问题。
装饰者模式相比继承,没有这么多繁杂的类,而且类与类的之间的耦合性降低,具体做法就是将类 FilterInputStream 提取为一个父类,而其子类就是各个功能的实现类。如果想要基础输入流要某个功能,那么就可以将对应的基础输入流传到对应的子类构造方法中。