【发布时间】:2017-03-24 16:59:52
【问题描述】:
假设我们已经实现了如下图所示的装饰器模式。使用 CondimentDecorator 类,可以装饰 Beverage 类。 cost() 和 getDescription() 方法会处理这个问题。
当创建如下所示的装饰饮料 时,调用方法getName() 对装饰对象不起作用。为了完成这项工作,这个方法也应该放在类 CondimentDecorator 中,并将调用委托给组合的 beverage 变量。
Beverage b = new Milk(new Espresso("A very nice espresso"));
b.getName() // returns null
当有很多不需要装饰的方法时,所有这些也应该放在CondimentDecorator中,以简单地委托。所以问题是:解决这个“问题”的简洁(普遍接受的)方法是什么?
【问题讨论】:
-
将它们添加到
CondimentDecorator假设它是装饰器基类的确切问题是什么(实现的方法,即 operation1() 等。仅存在于一个类中) -
“问题”是所有这些方法(例如 operation1())也应该放在
CondimentDecorator中以简单地委托,并且当有许多这样的方法时,它会“污染”我认为的装饰类 -
如果
operation1()没有装饰任何东西,为什么你需要把它放在CondimentDecorator里面? -
因为,假设
operation1()从Beverage类返回一个名为name的属性,在未将其委托给组合的beverage对象的情况下对装饰对象调用此方法不起作用。 -
根据图表,
CondimentDecorator是Beverage的子类,因此调用方法getName()将作用于装饰对象。
标签: java design-patterns decorator