Java IO包中哪些设计模式应用详解?
摘要:Java IO包(java.io)是设计模式应用的经典案例,其核心类库通过多种设计模式解决了“不同数据源数据类型的读写”“功能扩展”“资源管理”等核心问题。下面我会逐一拆解IO包中用到的核心设计模式,结合源码示例和使用场景讲清楚每个模式的
Java IO包(java.io)是设计模式应用的经典案例,其核心类库通过多种设计模式解决了“不同数据源/数据类型的读写”“功能扩展”“资源管理”等核心问题。下面我会逐一拆解IO包中用到的核心设计模式,结合源码示例和使用场景讲清楚每个模式的应用方式。
一、装饰器模式(Decorator Pattern)
核心作用
动态地给一个对象添加额外的功能,且不改变其原有结构,是继承的灵活替代方案。
IO包中的应用场景
IO包中字节流/字符流的功能扩展完全基于装饰器模式实现:
抽象组件(Component):InputStream/OutputStream(字节流)、Reader/Writer(字符流)——定义了IO操作的核心接口;
具体组件(ConcreteComponent):FileInputStream/FileOutputStream、FileReader/FileWriter——基础的数据源实现(直接操作文件);
装饰器抽象类(Decorator):FilterInputStream/FilterOutputStream、FilterReader/FilterWriter——继承自核心组件,持有一个核心组件的引用;
具体装饰器(ConcreteDecorator):BufferedInputStream(缓冲)、DataInputStream(基本类型读写)、InputStreamReader(字节转字符)——给基础流添加额外功能。
代码示例(装饰器模式核心体现)
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class DecoratorPatternDemo {
public static void main(String[] args) {
// 1. 基础组件:FileInputStream(直接读文件,无缓冲)
try (InputStream fileIn = new FileInputStream("test.txt");
// 2. 装饰器:BufferedInputStream(给基础流添加缓冲功能)
InputStream bufferedIn = new BufferedInputStream(fileIn);
// 可叠加多个装饰器:比如再套DataInputStream(添加基本类型读写)
// DataInputStream dataIn = new DataInputStream(bufferedIn);
) {
int data;
// 缓冲流通过预读数据减少磁盘IO,功能扩展但不改变InputStream接口
while ((data = bufferedIn.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
关键特点
装饰器和被装饰者实现同一个接口(如都继承InputStream),对外暴露统一API;
可叠加多个装饰器(如BufferedInputStream + DataInputStream),灵活组合功能;
无需修改原有类代码,符合“开闭原则”。
二、适配器模式(Adapter Pattern)
核心作用
将一个类的接口转换成客户期望的另一个接口,解决接口不兼容的问题。
IO包中的应用场景
最典型的是字节流与字符流的适配:
字节流(InputStream/OutputStream):处理二进制数据;
字符流(Reader/Writer):处理文本数据(按字符编码);
适配器类:InputStreamReader(字节流→字符流)、OutputStreamWriter(字节流→字符流)。
