https://www.nowcoder.com/discuss/393082924038393856?sourceSSR=search
装饰者模式、模板模式 工厂方法模式、适配器模式
chatgpt
在 Java 中,InputStream
和 OutputStream
的设计体现了一些关键的设计模式,主要包括以下几种:
InputStream
和 OutputStream
使用了装饰者模式来实现流的功能扩展。装饰者模式允许动态地向对象添加职责,而不需要修改其代码。
体现:
FileInputStream
和 FileOutputStream
)提供最基本的功能。BufferedInputStream
、DataInputStream
、BufferedOutputStream
等)通过包装基础流类或其他流类来添加额外的功能,例如缓冲、数据读取或对象序列化。示例:
InputStream inputStream = new FileInputStream("file.txt");
InputStream bufferedStream = new BufferedInputStream(inputStream);
DataInputStream dataStream = new DataInputStream(bufferedStream);
int data = dataStream.readInt(); // 读取一个整数
在上述代码中,DataInputStream
装饰了 BufferedInputStream
,而 BufferedInputStream
装饰了 FileInputStream
。
InputStream
和 OutputStream
的抽象类定义了通用的接口,而子类通过实现具体方法完成特定的行为。这种设计体现了模板方法模式。
体现:
InputStream
提供了通用方法如 read()
,但具体的读取行为(如从文件、网络或字节数组中读取数据)由子类实现。OutputStream
的 write()
方法也是类似的设计。示例:
public abstract class InputStream {
public abstract int read() throws IOException; // 抽象方法
public int read(byte[] b, int off, int len) throws IOException {
// 通用实现
for (int i = 0; i < len; i++) {
int data = read();
if (data == -1) break;
b[off + i] = (byte) data;
}
return len;
}
}
在某些场景中,InputStream
和 OutputStream
的实例化是通过工厂方法来完成的。例如,java.nio.file.Files
提供了 newInputStream
和 newOutputStream
方法,简化了流的创建。
Files.newInputStream(path)
和 Files.newOutputStream(path)
返回具体的流实例,而调用者并不需要关心具体的实现。