9

在阅读装饰器模式时,遇到了一些需要澄清的事情。在装饰器模式中,我们只是包装一个给定的对象并使用一个执行链进行计算。但是为什么我们不能拥有这些对象的列表并遍历每个对象。我的意思是没有链,我们不能只使用一个列表并通过每个对象进行简单的迭代吗?

谢谢

4

3 回答 3

7

我相信你已经错过了装饰者的重点。

装饰器旨在透明地添加行为。经典的例子是 Java 中的 InputStream。您可以将缓冲、gzip 功能链接到输入流。但是,该装饰输入流的“用户”不需要知道添加了额外的行为。用户只需将该装饰流用作普通流。当然,如果您将每个“行为”作为一个单独的对象,并将链存储为另一个列表并显式地单独调用它们,那么它会起作用。然而,它失去了装饰器的“透明度”。

于 2012-07-23T02:08:11.327 回答
2

使用列表,您需要一些对象来管理列表并遍历和应用对象。为了与插件兼容,管理器对象必须是所有对象的(通常是抽象的)基类的子类。它只是不如让每个对象知道它正在包装的东西那么灵活,仅此而已。

于 2012-07-23T01:01:35.770 回答
0

装饰动作将在 Object 中执行。使用列表,它在对象之外

于 2020-04-21T09:55:57.897 回答