面试中遇到了此类题目,再次做个记录,以备只需!
1.在Java的I/O中有两个设计的结构:装饰模式和适配器模式
2.Java库中的对称性:
(1)输出-输入对称:处理Byte流的InputStream和OutputStream;处理Char流的Reader和Writer。
(2)byte-char对称:InputStream与Reader的子类分别负责Byte和Char的输入;OutputStream与Writer的子类分别负责Byte和Char流的输出,它们分别形成平行的等级结构。
3.模式应用:
装饰模式:
InputStream的装饰模式
装饰模式的各个角色:
(1)抽象构件(Component)角色:由InputStream扮演。这是一个抽象类,为各种子类型流处理器提供统一的接口。
(2)具体构件(ConcreteComponent)角色:由ByteArrayInputStream、FileInputStream、 PipedInputStream以及StringBufferInputStream等原始流处理器扮演。他们实现了抽象构件角色所规定的接口,可以被 链接流处理器所装饰。
(3)抽象装饰(Decorator)角色:由FilterInputStream扮演。它实现了InputStream所规定的接口。
(4)具体装饰(ConcreteDecorator)角色:由几个类扮演,分别是DataInputStream、BufferInputStream以及两个不常用的类LineNumberInputStream和PushBackInputStream
注意:StringBufferInputStream、LineNumberInputStream已经过时,不再推荐使用。
OutputStream的装饰模式:
装饰模式中的各个角色:
(1)抽象构件(Component)角色:由OutputStream扮演。这是一个抽象类,为各种的子类型流处理器提供统一的接口。
(2)具体构件(ConcreteComponent)角色:由ByteArrayOutputStream、FileOutputStream以及PipedOutputStream等扮演,它们均实现了OutputStream所声明的接口。
(3)抽象装饰(Decorator)角色:由FilterOutputStream扮演。它有与OutputStream相同的接口,而这正是装饰类的关键。
(4)具体装饰(ConcreteDecorator)角色:由几个类扮演,分别是BufferedOutputStream、DataOutputStream,以及PrintStream。
Reader中的装饰模式:
装饰模式中的各个角色:
(1)抽象构件(Component)角色: 由Reader扮演。这是一个抽象类,为各种的子类型流处理器提供统一的接口。
(2)具体构件(ConcreteComponent)角色:有CharArrayReader、InputStreamReader、PipedReader以及StringReader等扮演,它们均实现了Reader所声明的接口
(3)抽象装饰(Decorator)角色:由BufferedReader以及FilterReader扮演。这两者有着与Readeer相同的接口,而这正是装饰类的关键
(4)具体装饰(ConcreteD)角色:分别是LineNumberReader作为BufferedReader的具体装饰角色,PushbackReader作为FilterReader的具体装潢角色。
Writer中的装饰模式:
装饰模式中的各个角色:
(1)抽象构件(Component)角色:由Writer扮演。这是一个抽象类,为各种的子类型流处理器提供统一的接口。
(2)具体构件(ConcreteComponent)角色:由CharArrayWriter、OutputStreamWriter、PipedWriter以及StringWriter等扮演,它们均实现了Reader所声明的接口。
(3)抽象装饰(Decorator)角色:由BufferedWriter、FilterWriter以及PrintWriter扮演,它们有着与Writer相同的接口。
(4)具体装饰(ConcreteDecorator)角色:是与抽象装饰角色合并的。由于抽象装饰角色与具体装饰角色发生合并,因为装饰模式在这里被简化了。
-----------------------------------------------------华丽的分割线----------------------------------------------------------------
适配器模式的应用:
ByteArrayInputStream是一个适配器类:
FileOutputStream是一个适配器类:
StringBufferInputStream是一个适配器类:
ByteArrayOutputStream是一个适配器类:
PipedOutputStream是一个适配器类:
CharArrayReader是一个适配器类:
StringReader是一个适配器类:
其他,关于InputStreamReader,PipedReader等也都是适配器类。
CharArrayWriter是一个适配器类:
PipedWriter是一个适配器类:
StringWriter是一个适配器类:
参考: