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

问题描述 投票:1回答:1

我一直在阅读装饰器模式。对我来说,装饰器类是抽象的,因为我看不到在任何情况下为什么都应该由它自己实例化它,但是实际上我找不到任何地方声明它必须是抽象的。

它总是抽象的对吗?

java design-patterns decorator
1个回答
0
投票

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

Wikipedia example中实现了两种类型的功能:

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

在Wikipedia示例中,类只有2个方法。这就是为什么将委托功能移到一个单独的类上根本没有任何意义的原因。 CoffeeDecorator的逻辑可以直接在WithMilk和WithSprinkles类中实现。但是,如果您要装饰一个具有20-30个方法的类,则可以像在此Wikipedia页面上那样设计类:将纯委托逻辑放置到一个类中,并将特定装饰器特定的逻辑放到其子类中。考虑关注点分离

通过这种设计,更容易测试和维护代码。基本装饰器类的测试很容易,因为其每个方法都应与装饰对象的方法完全相同。对特定装饰器的测试意味着(通常)对(通常)几种被覆盖的方法的测试。当您分析错误或想要扩展装饰器时,您会清楚每个类的职责。

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

© www.soinside.com 2019 - 2024. All rights reserved.