gpt4 book ai didi

java - IO 的 GoF 装饰器模式用例和示例

转载 作者:IT老高 更新时间:2023-10-28 20:29:28 26 4
gpt4 key购买 nike

我已阅读 wikipedia 装饰器模式用于.NetJava IO类。

谁能解释一下这是如何使用的?举个可能的例子有什么好处?

维基百科上有一个 Windows 窗体 的示例,但我想知道 Java IO 类是如何发生的。

最佳答案

InputStream是一个抽象类。最具体的实现,如 BufferedInputStream , GzipInputStream , ObjectInputStream等有一个构造函数,它采用 same 抽象类的实例。这是装饰器模式的识别键(这也适用于构造函数采用相同接口(interface)的实例)。

当使用这样的构造函数时,所有方法都将委托(delegate)给包装的实例,方法的行为方式会发生变化。例如,预先在内存中缓冲流,预先解压缩流或以不同方式解释流。有些甚至有额外的方法,最终也进一步委托(delegate)给包装的实例。这些方法用额外的行为装饰被包装的实例。

假设我们在一个 Gzip 文件中有一堆序列化的 Java 对象,并且我们想快速读取它们。

首先打开它的一个输入流:

FileInputStream fis = new FileInputStream("/objects.gz");

我们想要速度,所以让我们在内存中缓冲它:

BufferedInputStream bis = new BufferedInputStream(fis);

文件是gzip压缩的,所以我们需要解压缩它:

GzipInputStream gis = new GzipInputStream(bis);

我们需要反序列化这些 Java 对象:

ObjectInputStream ois = new ObjectInputStream(gis);

现在我们终于可以使用它了:

SomeObject someObject = (SomeObject) ois.readObject();
// ...

好处是您可以自由地使用一个或多个不同的装饰器来装饰流以满足您的需求。这比为每个可能的组合(如 ObjectGzipBufferedFileInputStreamObjectBufferedFileInputStreamGzipBufferedFileInputStreamObjectGzipFileInputStreamObjectFileInputStreamGzipFileInputStreamBufferedFileInputStream

请注意,当您要关闭流时,只需关闭 outermost 装饰器就足够了。它将一直委托(delegate)关闭调用到底部。

ois.close();

另见:

关于java - IO 的 GoF 装饰器模式用例和示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6366385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com