- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我已阅读 wikipedia 装饰器模式用于.Net和Java 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();
// ...
好处是您可以自由地使用一个或多个不同的装饰器来装饰流以满足您的需求。这比为每个可能的组合(如 ObjectGzipBufferedFileInputStream
、ObjectBufferedFileInputStream
、GzipBufferedFileInputStream
、ObjectGzipFileInputStream
、ObjectFileInputStream
、GzipFileInputStream
、BufferedFileInputStream
等
请注意,当您要关闭流时,只需关闭 outermost 装饰器就足够了。它将一直委托(delegate)关闭调用到底部。
ois.close();
关于java - IO 的 GoF 装饰器模式用例和示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6366385/
既然 GOF 的书是在 .Net 出现之前就整理好的,那么 GOF 中描述的特定模式是否不适合 .Net?如果是,原因是什么? 这是一个与最近赏金相关的问题 discussion . 最佳答案 GoF
此模式使用抽象工厂,然后使用工厂的实现。 我确定这两个类有一个标准的命名约定,但我不知道它是什么。 例如: public abstract class ChocolateFactory { }; pu
从 java 数据集中计算拟合优度 (GOF) 的选项是什么,我正在查看 apache math 3.0 库,但我无法理解使用它计算 GOF 的方法。对其他库或 math 3.0 有什么建议吗? 最佳
此主题的 Stackover 流相关帖子: Post_1和 Post_2 上面的帖子很好,但我仍然无法回答我的困惑,因此我把它作为一个新帖子放在这里。 我的问题 基于 GOF 的 Elements o
是否有任何 C# GOF 设计模式示例?我一直在寻找 this site确实有示例,但“C# 优化”示例仅在您购买其中一种产品时可用。 最佳答案 Steven John Metsker 写的一本名为“
我应该用 Java 创建一个迷你命令解释器 (System.in),以支持使用适当的 GoF 模式对图形对象进行操作。解释器的语法是一种简单的 EBNF 语言,如下所示:` ::=|||||||| :
让我们面对现实吧。单例模式是 highly controversial围墙两边都有大批程序员的话题。有些人觉得 Singleton 只不过是一个美化的全局变量,而另一些人则坚信模式并不断使用它。我不想
自从我开始学习 F#和 OCaml去年,我阅读了大量文章,这些文章坚持认为设计模式(尤其是在 Java 中)是命令式语言中缺失功能的解决方法。我找到的一篇文章 makes a fairly stron
我已阅读 wikipedia 装饰器模式用于.Net和Java IO类。 有人能解释一下这是如何使用的吗?举个可能的例子,它有什么好处? 维基百科上有一个 Windows 表单 示例,但我想知道 Ja
我们目前正在将 Access 应用程序大规模转换为 .NET 前端。许多 Access Apps 都有报表和创建 RDLC(或 Crystal rpt)的方法,并且带有数据集填充和绑定(bind)的主
我们需要构建一个解决方案来处理销售订单。处理是连续进行的:每个步骤负责特定的任务:检查客户是否有信用,检查所需元素是否有库存等。 我们想到使用 chain of responsibility patt
四人帮 Design Patterns使用文字处理器作为至少一些模式的示例,尤其是 Composite 和 Flyweight。 除了使用 C 或 C++ 之外,您真的可以使用这些模式和它们带来的面向
我正在模拟一种情况,其中有: NotificationBox:观察者 list1, list2, list3:主题 现在我会制作一张图表,其中使用观察者模式描述每个列表实现不同类型的 notify()
我正在讨论一些设计模式问题,并查看了 GoF 中装饰器模式的定义和示例。它说 Attach additional responsibilities to an object dynamically.
我很想知道哪个 GoF 设计模式直接转化为特定的 SOLID 原则?例如,我认为(在我看来)策略模式转化为依赖倒置原则。 不幸的是,我找不到任何研究他们关系的文献。如果能够更有效地学习彼此的观点,那就
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
如果将来您只能使用 Gang of Four book 中定义的一个规范模式。 ,您会选择哪一个?出于什么原因? 最佳答案 不是一种设计模式,但对我来说,这个原则绝对是对我整本书的编程风格影响最大的:
这个问题的答案是community effort .编辑现有答案以改进这篇文章。它目前不接受新的答案或互动。 我正在学习 GoF Java 设计模式,我想看看它们的一些真实例子。 Java 核心库中这
我正在使用kendoTreeList 我正在尝试扩展所有组。这是我的code sample 但似乎 kendoTreeList 仅支持扩展第一组。我也在扩展方法中尝试了以下选择器。 treeList.
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Which are C# native built-in design patterns? Design P
我是一名优秀的程序员,十分优秀!