在Java中使用Decorator设计模式时,Decorator的顺序重要吗?

在Java中使用Decorator设计模式时,Decorator的顺序重要吗?,java,design-patterns,decorator,Java,Design Patterns,Decorator,在阅读有关Java I/O类的使用的文章时,我看到了许多对象的多个变体,它们被用来获得另一个结果,我想知道将这些对象按特定的顺序放置是否重要,还是不管它们的顺序如何,我都必须使用它们 例如: BufferedReader br = new BufferedReader(new FileReader(FILENAME))) BufferedReader包装FileReader是否重要,反之亦然?当代码以这种方式编写时,其工作方式是否相同: new FileReader(new BufferedR

在阅读有关Java I/O类的使用的文章时,我看到了许多对象的多个变体,它们被用来获得另一个结果,我想知道将这些对象按特定的顺序放置是否重要,还是不管它们的顺序如何,我都必须使用它们

例如:

BufferedReader br = new BufferedReader(new FileReader(FILENAME)))
BufferedReader包装FileReader是否重要,反之亦然?当代码以这种方式编写时,其工作方式是否相同:

new FileReader(new BufferedReader(FILENAME))
new FileReader(new BufferedReader(FILENAME))

我并不是说只有两个物体被使用的情况,当我们使用更多的物体时,包装的顺序是否重要

当然,这是不一样的。把它看成是一条链子。

简单示例:当通过给定的FileReader对绑定到文件IO的缓冲读取器调用read时,它会参数化对底层FileReader文件的读取,然后根据返回字节依次提供其自己的缓冲区,然后返回给调用者。所以您实际上是在读取缓冲文件

您不能简单地执行相反的操作:在触发或绑定到BufferedReader上的缓冲读取的FileReader上调用读取???->毫无意义,最新版本究竟会读到什么

您应该回顾Java中流的基础知识,以了解其完整性

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

new FileReader(new BufferedReader(FILENAME))
new FileReader(new BufferedReader(FILENAME))
是的。顾名思义,文件阅读器读取文件,而BufferedReader不读取,因此将文件名传递给BufferedReader没有意义,也无法编译

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

现在,可能存在顺序无关紧要的情况,但在本例中,顺序无关紧要


不过请注意,FileReader并不是一个装饰者。

就目前而言,您的具体要求有点不清楚。在问题被否决和结束之前,请用一些代码示例进行解释。谢谢你的建议,我希望我现在就说清楚。好吧,你的两个代码示例都是一样的!这两种情况都将文件读取器包装在BufferedReader中。在这一点上,我强烈建议您收集您的想法,并思考您的问题。答案已经在那里了。第二个代码没有编译。好的,谢谢。你能不能确认一下,让我明确一点——在许多不同的情况下使用的包装必须按照严格定义的顺序使用。我这么问是因为I/O库中有这么多类,而且我仍然是Java新手,要正确使用它们似乎有点困难。对不起,如果我的问题不恰当。