gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:13:09 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

假设我们在一个 Gzipped 文件中有一堆序列化的 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

请注意,当您要关闭流时,只需关闭最外面装饰器就足够了。它将把最后的调用一直委托(delegate)给底部。

ois.close();

另请参阅:

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

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