io

概述

  1. 谈谈io与装饰者模式

io与装饰者模式

首先,装饰者模式中装饰者和被装饰者都会继承同一个Component(抽象类或者接口),通常情况,装饰者大多会直接继承一个抽象的装饰者Decorator,这个抽象的装饰者直接继承Component,且抽象装饰者中保存了被装饰者的一个引用,装饰者会将客户端所有的请求都应用到被装饰者上,并动态地增强被装饰者的属性或者功能。当然这个抽象的装饰者可以不存在,所有的具体装饰者直接继承Component,但是必须保存被装饰者的一个引用,区分具体被装饰者和具体装饰者的关键点就是看这个类是否有一个Component的一个引用,因为装饰者需要这个引用来动态的将请求应用到具体的被装饰着身上,以达到增强属性和功能的目的。
装饰者的模式的优点:

  • 扩展性好
    可以针对Component扩展出很多具体的被装饰者concreteComponent,也可以针对Ddecorator扩展出很多具体的装饰者concreteDecorator
  • 灵活性好
    不同的具体装饰者和不同的具体被装饰者可以灵活组合,以实现丰富的功能

装饰者模式的缺点:

  • 程序中会出现很多小类,即各种各样的具体装饰者和具体被装饰者

在java的io框架中有4个基类,分别是InputStream, OutputStream, Reader, Writer, 它们扮演着Component的角色,所有的被装饰者都会直接继承

直接继承InputStream的具体被装饰者有哪些? 比如:FileInputStream, PipedInputStream, ByteArrayInputStream.
直接继承OutputStream的具体被装饰者有哪些? 比如:FileOutputStream, PipedOutputStream, ByteArrayOutputStream.
直接继承Reader的具体被装饰者有哪些? 比如:StringReader, CharArrayReader, PipedReader.
直接继承Writer的具体被装饰者有哪些? 比如:StringWriter, CharArrayWriter, PipedWriter.

装饰InputStream的具体装饰者(可以是抽象的类,也可以是具体的类)有哪些? 比如:
FilterInputStream,
SequenceInputStream,
BufferedInputStreamDataInputStream都继承自FilterInputStream,
ObjectInputStream它内部保存了一个BlockDataInputStream的一个引用,它是一个继承InputStream的私有内部类,这些装饰者都是具体的装饰者,并非抽象类。

装饰OutputStream的具体装饰者(可以是抽象的类,也可以是具体的类)有哪些? 比如:
FilterInputStream,
BufferedInputStreamDataOutputStreamPrintStream都继承自FilterInputStream,
ObjectOutputStream它内部保存了一个BlockDataOutputStream的一个引用,它是一个继承OutputStream的私有内部类,这些装饰者都是具体的装饰者,并非抽象类。

装饰Reader的具体装饰者(可以是抽象的类,也可以是具体的类)有哪些? 比如:
FilterReader是一个抽象装饰者,
BufferedReader是一个具体的装饰者,
InputStreamReader是一个具体装饰者,它并没有直接保存Reader的引用,但是它保存了一个StreamDecoder的引用,而StreamDecoder是一个具体的被装饰者。

装饰Writer的具体装饰者(可以是抽象的类,也可以是具体的类)有哪些? 比如:
PrintWriter,
BufferedWriter,
OutputStreamWriter并没有直接保存Writer的引用,但是它保存了一个StreamEncoder的引用,而StreamEncoder是一个具体的被装饰者。

参考链接

https://zhuanlan.zhihu.com/p/28286559