概述
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
,BufferedInputStream
和DataInputStream
都继承自FilterInputStream
,ObjectInputStream
它内部保存了一个BlockDataInputStream
的一个引用,它是一个继承InputStream
的私有内部类,这些装饰者都是具体的装饰者,并非抽象类。
装饰OutputStream
的具体装饰者(可以是抽象的类,也可以是具体的类)有哪些? 比如:FilterInputStream
,BufferedInputStream
、DataOutputStream
和PrintStream
都继承自FilterInputStream
,ObjectOutputStream
它内部保存了一个BlockDataOutputStream
的一个引用,它是一个继承OutputStream
的私有内部类,这些装饰者都是具体的装饰者,并非抽象类。
装饰Reader
的具体装饰者(可以是抽象的类,也可以是具体的类)有哪些? 比如:FilterReader
是一个抽象装饰者,BufferedReader
是一个具体的装饰者,InputStreamReader
是一个具体装饰者,它并没有直接保存Reader
的引用,但是它保存了一个StreamDecoder
的引用,而StreamDecoder
是一个具体的被装饰者。
装饰Writer
的具体装饰者(可以是抽象的类,也可以是具体的类)有哪些? 比如:PrintWriter
,BufferedWriter
,OutputStreamWriter
并没有直接保存Writer
的引用,但是它保存了一个StreamEncoder
的引用,而StreamEncoder
是一个具体的被装饰者。