【问题标题】:Is order of decorators important while using Decorator Design Pattern in Java? [closed]在 Java 中使用装饰器设计模式时,装饰器的顺序是否重要? [关闭]
【发布时间】:2017-10-29 13:48:33
【问题描述】:

在阅读有关使用 Java I/O 类的信息时,我看到许多对象的多种变体用于获得另一个结果,我想知道将这些对象按特定顺序放置是否重要,或者我只需要使用它们不管按什么顺序。

例如:

BufferedReader br = new BufferedReader(new FileReader(FILENAME)))

BufferedReader “包装” FileReader 是否重要,反之亦然?以这种方式编写的代码是否会以相同的方式工作:

new FileReader(new BufferedReader(FILENAME))

我不仅仅说只使用两个对象的情况,当我们使用更多对象时,“包装器”的顺序是否重要?

【问题讨论】:

  • 就目前而言,有点不清楚您到底在问什么。在问题被否决和关闭之前,请用一些代码示例进行解释。
  • 感谢您的建议,希望我现在就说清楚了。
  • 好吧,你的两个代码示例都是一样的!这两种情况都将FileReader 包装在BufferedReader 中。在这一点上,我强烈建议你收集你的想法并思考你在问什么。答案已经存在。
  • 第二个代码无法编译。
  • 好的,谢谢。您能否向我确认一下以使其清楚 - 在许多不同情况和情况下使用的包装器必须以严格定义的顺序使用。我之所以这么问,是因为 I/O 库中有这么多类,而且对我来说正确使用它们似乎有点困难,因为我仍然是 Java 新手。对不起,如果我的问题不正确。

标签: java design-patterns decorator


【解决方案1】:

如果 BufferedReader “包装” FileReader 而不是反之,这有关系吗 反之?以这种方式编写的代码是否会以相同的方式工作:

new FileReader(new BufferedReader(FILENAME))

是的,确实如此。顾名思义,FileReader 读取文件,BufferedReader 不读取,因此将文件名传递给 BufferedReader 没有意义,也无法编译。

FileReader,另一方面,读取文件。将其他流传递给它是没有意义的,因为它是用来读取文件而不是其他流的,因此将 BufferedReader 传递给它不会编译。

现在,可能存在顺序无关紧要的情况,但在这种情况下,它确实如此。

请注意,FileReader 不是装饰器。

【讨论】:

    【解决方案2】:

    当然这不一样。只需将其视为一条链即可。

    简单示例:当在绑定到文件 IO(通过给定 FileReader)的缓冲读取器上调用 read() 时,它会参数化底层 FileReader 文件上的 read(),然后根据返回字节,然后返回给调用者。所以你实际上是在读取缓冲文件。

    你不能简单地做相反的事情:在 FileReader 上调用 read() 触发或绑定到 BufferedReader 上的缓冲 read() ?? -> 没有意义(最新的实际会读到什么?)

    您应该查看 Java 中流的基础知识以确保完整性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2010-10-05
      • 1970-01-01
      • 2020-11-24
      • 2010-09-21
      • 2015-03-28
      相关资源
      最近更新 更多