【问题标题】:Decorator Design Pattern Ambigous装饰器设计模式模棱两可
【发布时间】:2015-05-19 20:09:47
【问题描述】:

以简单的类图为例

我的问题是为什么我们需要OptionalWrapperOptionalOneOptionalTwoOptionalThree 实现 Interface 还不够吗,因为我们只需要装饰器类中的 Interface 类型的对象。

【问题讨论】:

  • 使用OptionalWrapper 允许在类中进行依赖注入。这样,您可以更改OptionalWrapper 中的实现细节,而无需更改OptionalOneOptionalTwoOptionalThree 中的任何内容。

标签: java design-patterns decorator


【解决方案1】:

OptionalWrapper 是您添加对您正在装饰的类的引用,并将其所有方法重定向到该实例的位置。如果您没有OptionalWrapper,那么您需要在其每个子类中重复此代码。在给定的图表中,每个子类只需要覆盖它们应该修改的行为。

【讨论】:

  • doThis() 将由所有 optionalOne/Two/Three 类实现...OptionalWrapper 不会实现doThis()。而在 OptionalWrapper 中,我们不添加对您正在装饰的类的引用,我们在 OptionalOne/Two/Three 类中添加引用...
  • @Junaid 如果接口有doThis()以外的其他方法怎么办?是否要在所有子类中重复代码?
  • 所以 1) OptionalWrapper 只是为了恢复,对吧?而且2)它在装饰物件方面并没有什么好的作用,对吧?
  • @Junaid 是的,这两个都是正确的。 OptionalWrapper 只是公开了一堆调用wrapee 实例上相应方法的方法。您可以通过覆盖其中一些方法来在其子类中进行装饰。
【解决方案2】:

一个更具体的例子:你想添加异常处理。您可以在 OptionalWrapper 中执行一次并完成,或者您可以在三个子类中的每一个中实现它(以及实现接口的每个新类)。

【讨论】:

    【解决方案3】:

    1) 在您的示例中,如果您决定在所有装饰器 OptionalOneOptionalTwoOptionalThree 中添加新行为,那么您将在 Interface 中添加一个新方法,但这会影响 CoreFunactionality。因此,要将其分开,您还需要一个接口/抽象类OptionalWrapper

    2) 所有装饰器只需要处理OptionalWrapper,不用担心它在装饰什么实例。

    【讨论】:

      【解决方案4】:

      这里的可选包装器是您的装饰器类,在大多数情况下它将是抽象的。它增强了对象的职责。如果您在界面中添加了一些不需要在可选类中实现的功能(optional1、optiona2 等),您将需要一个抽象的可选包装器。

      【讨论】:

        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多