在Java中使用Decorator Design Pattern时装饰器的顺序是否重要?

时间:2017-10-29 13:48:34

标签: java design-patterns decorator

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

例如:

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

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

new FileReader(new BufferedReader(FILENAME))

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

2 个答案:

答案 0 :(得分:1)

  

如果BufferedReader“包装”FileReader而不是副本,这是否重要?   反之亦然?当代码以这种方式编写时,代码的工作方式是否相同:

new FileReader(new BufferedReader(FILENAME))

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

另一方面,

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

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

但请注意,FileReader不是装饰者。

答案 1 :(得分:0)

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

简单示例:当在绑定到文件IO的缓冲读取器上调用read()(通过给定的FileReader)时,它会参数化基础FileReader文件上的read(),然后根据它自己提供缓冲区(依次)返回字节,然后返回给调用者。所以你实际上正在进行缓冲文件读取。

你不能简单地做反过来:在FileReader上调用的read()触发或绑定到BufferedReader上的缓冲读取()? - >毫无意义(最新的实际内容是什么?)

为了完整性,您应该查看Java中的流的基础知识。