当前位置: 首页 > 面试题库 >

装饰器模式:为什么需要抽象装饰器?

皇甫飞光
2023-03-14
问题内容

基本上,我想知道为什么必须创建一个抽象装饰器类来实现(或扩展)某些接口(或抽象类)。为什么所有新的“装饰类”都不能简单地实现(或扩展)基本抽象对象本身(而不是扩展抽象装饰器类)?

为了更具体一点,我将使用设计模式书中涉及咖啡饮料的示例

  • 有一个称为的抽象组件类 Beverage
  • 简单的饮料类型,例如HouseBlend简单扩展Beverage
  • 为了装饰饮料,CondimentDecorator创建了一个抽象类,该类扩展Beverage并具有Beverage
  • 假设我们要添加“牛奶”调味品,将Milk创建一个扩展CondimentDecorator

我想了解为什么我们需要CondimentDecorator该类,以及为什么该类Milk不能简单地扩展Beverage类本身并Beverage在其构造函数中传递一个实例。

希望这很清楚… 如果不是, 我只是想知道 为什么此模式需要抽象装饰器类 ?谢谢。

编辑:我试图实现这一点,省略了抽象装饰器类,它 似乎
仍然可以工作。这个抽象类是否在此模式的所有描述中都存在,仅仅是因为它为所有新装饰的类提供了标准接口


问题答案:

它使您可以使用各种装饰器以不同的组合独立地装饰基类,而不必为每种可能的组合派生一个类。例如,假设您要Beverage搭配牛奶和肉豆蔻。使用基于抽象装饰器类的装饰器,您只需使用MilkNutmeg装饰器进行包装即可。如果它是从派生的Beverage,则必须有一个MilkWithNutmegBeverage类,一个MilkBeverage类和一个NutmegBeverage类。您可以想象一下,随着可能的组合数量的增加,这种爆炸式增长。使用抽象装饰器实现可将其减少为每个装饰仅一个装饰器类实现。



 类似资料:
  • 问题内容: 假设我有一个名为的类,并且我想使用装饰器设计模式。如果我错了,请纠正我,但是要使其正常工作,我们需要创建一个装饰器类,例如,该类将保留对实例的引用,所有其他装饰器将对其进行扩展以添加功能。 我不明白为什么我们必须创建装饰器类而不是使用实例? 问题答案: 装饰器模式用于动态地(即在运行时)向对象添加功能。通常,在编写类时,对象将具有固定的功能。但是重要的一点是,对象的功能以对对象的客户端

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Circle.java,ShapeDecorator.java,RedShapeDecorator.java,DecoratorPatternDemo.java装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加

  • 装饰器是旨在提升重用性能的一种结构性设计模式。同Mixin类似,它可以被看作是应用子类划分的另外一种有价值的可选方案。 典型的装饰器提供了向一个系统中现有的类动态添加行为的能力。其创意是装饰本身并不关心类的基础功能,而只是将它自身拷贝到超类之中。 它们能够被用来在不需要深度改变使用它们的对象的依赖代码的前提下,变更我们希望向其中附加功能的现有系统之中。开发者使用它们的一个通常的理由是,它们的应用程

  • Whenever we want to add extra functionality to an object, we have a number of different options. We can: 任何时候,只要我们想给一个对象添加附加的功能,就有多个不同的选项供我们选择。我们可以选择: Add the functionality directly to the class the o