装饰器类在Java中应该是抽象的吗?

装饰器类在Java中应该是抽象的吗?,java,design-patterns,decorator,Java,Design Patterns,Decorator,我一直在读关于装饰图案的书。对我来说,装饰器类是抽象的是有道理的,因为我不明白为什么在任何场景中它都应该由自己实例化,但是我实际上还没有找到任何地方表明它无论如何都必须是抽象的 它总是抽象的,对吗?不,装饰师不一定是抽象的 在中,实现了两种类型的功能: 委托给需要修饰的实例 修改装饰对象的功能 在Wikipedia示例中,类只有2个方法。这就是为什么将功能委托给一个单独的类是否有意义并不明显。CoffeeDecorator的逻辑可以直接在WithMilk和WithSprinkles类中实现。

我一直在读关于装饰图案的书。对我来说,装饰器类是抽象的是有道理的,因为我不明白为什么在任何场景中它都应该由自己实例化,但是我实际上还没有找到任何地方表明它无论如何都必须是抽象的


它总是抽象的,对吗?

不,装饰师不一定是抽象的

在中,实现了两种类型的功能:

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

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


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

装饰器的语义因语言而异,因此您应该指出您所询问的语言。我不确定抽象装饰器如何有用。您需要一个具体的decorator类才能创建一个。否则,你怎么能装饰任何东西?decorator是否扩展抽象类是一个实现细节,这无关紧要。可能是我用错误的方式编写的。我指的是装饰师本身。是否应将其实例化为抽象类?有关示例,请参见。有两个装饰师:牛奶装饰师和皱纹装饰师。他们都是具体的班级。如果它们是抽象类,它们将无法使用。我不知道你所说的“实例化为抽象类”是什么意思。给出一个具体的例子来解释你的意思。在我的链接中,WindowDecorator是两个具体的装饰器HorizontalScrollbarDecorator和VerticalScrollbarDecorator的抽象基类。正如我在前面的评论中所说,这是一个实现细节:无论这两个具体的装饰器是否扩展了一个抽象类,都不会改变它们的功能和使用方式。