使用许多装饰器时如何实现装饰器模式

时间:2019-11-03 14:53:03

标签: design-patterns

我正在为装有多种咖啡的咖啡机编程。我提供普通的咖啡,浓缩咖啡,卡布奇诺咖啡,还提供爱尔兰咖啡(威士忌,咖啡,糖,生奶油),西班牙咖啡(君度,干邑,咖啡,糖,生奶油)和意大利咖啡(Amaretto,咖啡,糖,生奶油) )。

我计划在将来添加更多种咖啡,这就是为什么需要轻松添加更多咖啡而无需为每种添加类的原因。

我的解决方案是使用装饰器模式。但这会给我留下许多装饰,例如SugarDecoratorMilkDecoratorWhiskeyDecoratorAmarettoDecoratorWhippedCreamDecorator ...

如何在不为每个调味品添加装饰器的情况下解决此问题?

2 个答案:

答案 0 :(得分:1)

您可以使用Builder pattern向Coffee添加更多属性,例如加糖和牛奶:

Coffee.builder().sugar(true).milk(true).build();

这样,就没有多余的类了,只有属性,但是您需要在创建咖啡时 build

  

Builder Pattern使得在构建时可以轻松构建可以在独立方向上扩展的对象,而Decorator Pattern可以让您在构建后向对象添加功能扩展。

答案 1 :(得分:0)

装饰器并非如此,您似乎想添加可选成分。为此,您可以使用@ user7294900建议的 Builder

当我们希望为对象添加新功能时,可以使用

装饰器模式,同时使用早期的对象作为原材料。通常,为什么我们需要担心添加的装饰器类(需要时),只要它们为现有对象提供所需的附加功能即可。装饰器类不会增加额外的成本,因为它们可以在运行时选择添加,并且是按使用量付费类型