【问题标题】:Should a decorator class be abstract in Java?Java 中的装饰器类应该是抽象的吗?
【发布时间】:2020-01-05 16:13:40
【问题描述】:

我一直在阅读有关装饰器模式的文章。对我来说,装饰器类是抽象的是有道理的,因为我不明白为什么它应该在任何情况下由它自己实例化,但是我实际上还没有找到任何地方说明它无论如何都必须是抽象的。

总是抽象的对吗?

【问题讨论】:

  • 装饰器的语义因语言而异,因此您应该指出您要询问的语言。
  • 我不确定抽象装饰器会有什么用处。您需要一个具体的装饰器类才能创建一个。否则,你怎么可能装饰任何东西?装饰器是否扩展抽象类是无关紧要的实现细节。
  • 可能是我写错了。我的意思是装饰器本身。是否应该实例化为抽象类?
  • en.wikipedia.org/wiki/… 的例子。有两个装饰器:WithMilk 和 WithSprinkles。它们都是具体的类。如果它们是抽象类,它们将无法使用。我不知道“实例化为抽象类”是什么意思。举一个具体的例子来解释你的意思。
  • 在我的链接中,WindowDecorator 是两个具体装饰器 Horizo​​ntalScrollbarDecorator 和 VerticalScrollbarDecorator 的抽象基类。正如我在之前的评论中所说的那样,这是一个实现细节:这两个具体的装饰器是否扩展了一个抽象类并不会改变它们的作用以及您使用它们的方式。

标签: java design-patterns decorator


【解决方案1】:

不,装饰器不必是抽象的。

Wikipedia example 中实现了两种功能:

  • 委派给需要修饰的实例
  • 修改装饰对象的功能

在 Wikipedia 示例中,类只有 2 个方法。这就是为什么将功能委托给单独的类是否有意义并不明显。 CoffeeDecorator 的逻辑可以直接在 WithMilk 和 WithSprinkles 类中实现。但是如果你想装饰一个有 20-30 个方法的类,那么像这个维基百科页面那样设计类是有意义的:你把纯委托逻辑放到一个类中,将特定装饰器的特定逻辑放到它的子类中。考虑关注点分离

这样的设计更容易测试和维护代码。基本装饰器类的测试很容易,因为它的每个方法都应该与被装饰对象的方法完全相同。并且对特定装饰器的测试意味着“仅”测试(通常)几个被覆盖的方法。当你在分析一个 bug 或者你想扩展装饰器时,你很清楚每个类的职责。

基础装饰器必须是抽象的吗?不,但这可能很有用。如果您使基本装饰器类非抽象,则每个开发人员都可以创建它的实例。但是这个基类与装饰类相比没有额外的业务功能,因为这意味着一些性能开销。为避免不必要的性能开销,将此类声明为抽象类是有意义的。

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2013-04-12
    • 1970-01-01
    • 2022-10-07
    • 2015-02-07
    • 1970-01-01
    • 2020-09-25
    • 2018-11-27
    • 2019-01-18
    相关资源
    最近更新 更多