从装饰者设计模式学习Java IO

一个类的功能扩展可以有两种方式
(1) 类的继承 ( 高耦合,会产生更多的子类,从而引起类的爆炸 )
(2) 对象组合即装饰模式 ( 降耦,不会创造更多的子类 ) 动态的为对象添加功能) 所以类应该对扩展开放,对修改关闭 。
 
装饰者设计模式注意事项:
(1) 装饰者和被装饰者必须具有相同的超类型。
(2) 装饰者即可以包装被装饰者,也可以包装装饰者。往往利用多层包装来达到目的。

(3) 装饰者中组合了被装饰者对象 ( 装饰类的关键特征 ) 。使得我们能够通过嵌套装饰来动态扩展行为。

四个概念:

  (1) 抽象的构件角色( Component):
   
它是一个接口,封装了将要添加的功能(方法)。
    它相当于
IO 中的 InputStream 。( OutputStream

(2) 具体的构件角色( ConcreteComponent ):
它是一个类,该类实现了 Component 接口,因此该类中封装了将要添加的功能的一种实现方法。

(3) 装饰角色( Decorator): 它是一个类,该类也实现了 Component 接口,同时也必须持有接口 Component 的对象的引用,
该类也实现了
Component 接口中的方法。
a: 该类的构造方法需要传递过来一个 Component 对象的引用。
b: 重写的方法(即是添加的功能)需要调用 Component 对象的该方法。

(4) 具体的装饰角色( Decorator 类的子类,可以有一个,也可以有多个):
这些类继承了类
Decorator, 要重写父类的方法(要添加的功能),和自身的构造方法。
a: 构造方法要用到 super。
b:
第一步: super 父类的该方法。
     第二步:添加自己的功能(一些句子)。

装饰者 :Java IO 框架和 Collection 框架

( ) Java IO 框架 J DK5.0 60 多个 IO 流类组成了四大家族: InputStream OutputStream Reader Writer

InputStream / OutputStream 是对字节序列进行操作的抽象类。

Reader/Writer 是基于 Unicode 代码单元进行操作的抽象类。

InputStream 具有读入功能的抽象被装饰器。

FileInputStream   具有读入文件功能的具体被装饰器

  FilterInputStream   具备装饰器的抽象意义

  BufferedInputStream    具有具体功能 ( 缓冲功能 ) 的装饰器

InputStream :字节序列输入类鼻祖 ---------------------- Component
public abstract class InputStream implements Closeable
最基本的读取字节的抽象方法,供子类扩展。
public abstract int read() throws IOException ;
FileInputStream : 读取文件中的字节流类 继承 InputStream ------------ ConcreteComponent
public class FileInputStream extends InputStream
构造函数
public FileInputStream (String name) throws FileNotFoundException
本地方法,与操作系统低层交互的具体读入方法
public native int read() throws IOException ; ( 基于本地方法的底层实现 ,java 调用非 java 程序实现 )
FilterInputStream : 过滤流类,起装饰器作用,用于对输入装配各种功能 ------------ Decorator
public class FilterInputStream extends InputStream
用于记录被装饰者,也就是需要装配新功能的 InputStream 对象
protected volatile InputStream in;
构造装饰器  in 用来设置需要被包装 InputStream 对象
protected FilterInputStream ( InputStream in) { this.in = in; // 设置需要被包装 InputStream 对象 }
读入字节
public int read() throws IOException { return in.read (); }
BufferedInputStream : 使输入流具有缓冲功能,是一种可以装配缓冲功能的装饰器,继承 FilterInputStream --------------------------- ConcreteDecorator
public class BufferedInputStream extends FilterInputStream
// 构造器      in 就是被装配缓冲功能的 InputStream

public BufferedInputStream ( InputStream in) { this(in, defaultBufferSize );

 

转自:http://mengzhenbin.iteye.com/blog/1395613

原文地址:https://www.cnblogs.com/hnrainll/p/2735654.html