【问题标题】:Decorator not implementing decorated interface装饰器没有实现装饰接口
【发布时间】:2019-07-23 05:48:08
【问题描述】:

我有一个小项目,我将一个类的对象与另一个类包装在一起。 Decorated 类实现了一个接口,但 Decorator 类没有实现它。我很好奇它仍然是装饰器模式还是其他模式,并且“装饰器”类在我的项目中应该称为 Wrapper 而不是 Decorator。

我检查了 iluwatar github 存储库 (https://github.com/iluwatar/java-design-patterns/tree/master/decorator/src/main/java/com/iluwatar/decorator) 和 tutorialspoint (https://www.tutorialspoint.com/design_pattern/decorator_pattern)。 例如在 iluwatar 有: 装饰师:

public class ClubbedTroll implements Troll

装饰:

public class SimpleTroll implements Troll

在这两种情况下(iluwatar 和 tutorialspoint),装饰器和装饰类都有共同的接口实现。这是否意味着必须将其称为装饰器设计模式?

【问题讨论】:

  • 我不明白试图找出您对(我猜)主要是人为问题的解决方案是否必须坚持某种设计模式 - 设计模式是最佳实践解决方案 用于常见问题并且没有自己的价值,所以如果您问我们装饰器是否可以很好地解决您的问题,我们可以提供帮助,但现在它没有那么有意义。
  • public class ClubbedTroll extends SimpleTroll ...
  • 如果“装饰器”没有实现被装饰的接口,它就不是装饰器,因为它不能像被装饰的类型那样工作。那么它只是一个包装器。装饰器 IS 是具有附加功能的装饰类型。 装饰器和被装饰器必须是同一类型(共享同一接口或基类)。试试this

标签: java design-patterns


【解决方案1】:

我会说如果你没有在你的装饰器中实现接口,那么它就不能像原来的东西(装饰的)那样工作。如果你正在实现接口,你可以在任何地方使用装饰器,如果类的话,你可以使用原始接口完成它。这就是你必须使用界面的原因。

如果你只是包装装饰,你有一个包装器(委托模式)。

【讨论】:

    【解决方案2】:

    Decrator 模式的本质是在不扩展对象的情况下为对象添加附加功能。关键字是additional,表示对象的公共API(或接口)仍然保持不变。没有这个概念,就没有使用装饰器的意义。

    所以问题实际上是“在没有实现interface 的情况下,一个对象是否仍然提供相同的公共 API?”

    恕我直言,这在其他语言中是可能的,但在 Java 中这是没有意义的,因为您不能保证一个对象具有相同的公共 API,因此需要依赖它。

    至于 Wrapper - 这是Adapter pattern 的另一个名称。

    【讨论】:

    • 装饰器和装饰器必须是可互换的。调用者需要接口TypeA,所以装饰器必须可以分配给TypeA类型的变量,并且表现得像TypeA。因此装饰器必须实现TypeATypeA decorated = new Decorated() 必须像 TypeA impl = new Decorator(decorated) 一样工作,因此装饰器和装饰器是可以互换的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多