java的inputstream和outputstream体系是装饰者模式的典型实践,通过不修改原有类动态添加缓冲、加密等功能,核心角色包括抽象组件、具体组件、装饰者抽象和具体装饰者,支持透明、可嵌套的流增强。

Java 的 InputStream 和 OutputStream 体系是装饰者模式(Decorator Pattern)的典型实践,核心思想是**不修改原有类的前提下,动态地为流对象添加功能**,比如缓冲、加密、压缩、字符编码转换等。
装饰者模式在字节流中的结构特征
该架构围绕四个关键角色展开:
-
抽象组件(Component):即
InputStream和OutputStream抽象类,定义了基础读/写操作(如read()、write(int)、close()); -
具体组件(Concrete Component):如
FileInputStream、ByteArrayInputStream、FileOutputStream等,提供最原始的数据源或目标; -
装饰者抽象(Decorator):同样继承自
InputStream或OutputStream,内部持有一个被装饰的流对象(通常通过构造函数传入),并默认委托所有方法调用给它; -
具体装饰者(Concrete Decorator):如
BufferedInputStream、DataInputStream、CheckedOutputStream,在委托基础上增强行为——例如缓冲读取、按类型解析数据、计算校验和。
典型装饰链示例与工作逻辑
以带缓冲和数据解析的文件读取为例:
InputStream in = new DataInputStream(
new BufferedInputStream(
new FileInputStream("data.bin")
)
);
执行 in.readUTF() 时:
-
DataInputStream先尝试从其内部BufferedInputStream读取字节; -
BufferedInputStream检查缓冲区是否有足够数据,若不足则调用底层FileInputStream填充缓冲区; - 最终字节流经层层委托和增强,完成 UTF-8 字符串的解析。
这种链式调用体现了“透明性”——客户端只面向 InputStream 编程,无需知晓具体实现和装饰顺序。
设计要点与使用注意事项
装饰者模式在此处成功的关键在于:
-
统一类型接口:所有装饰者与被装饰者类型一致(都是
InputStream子类),支持任意嵌套; - 构造注入依赖:每个装饰者必须接收一个同类型流作为参数,形成可组合的构建方式;
-
避免功能重叠或冲突:例如不应同时套用两个缓冲装饰者,也不应在未缓冲的流上直接调用
DataInputStream的readLine()(已废弃且依赖换行符检测,易出错); -
关闭流需谨慎:只需关闭最外层装饰者(如
in.close()),它会自动调用内部流的close()(前提是装饰者正确实现了委托)。
与继承和代理的区别
它不是简单继承——BufferedInputStream 并非为了扩展 FileInputStream 的能力而继承它,而是“包装”任意 InputStream;
它也不同于普通代理——装饰者本身是流家族的合法一员,能参与任何接受 InputStream 的 API,且可被继续装饰,具备高度灵活性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











