我正在阅读Head First Design Patterns一书,我特别关注Decorator
模式的Starbuzz示例。
我无法理解提供的示例中CondimentDecorator
的确切需求。为什么Mocha
不能简单地延长Beverage
?另一层抽象需要什么?`
public abstract class Beverage
{
String description = "Unknown beverage";
public String getDescription()
{
return description;
}
public abstract double cost();
}
public abstract class CondimentDecorator extends Beverage
{
public abstract String getDescription();
}
public class Mocha extends CondimentDecorator
{
Beverage b;
public Mocha(Beverage b)
{
this.b=b;
}
public String getDescription()
{
return b.getDescription() + ", Mocha";
}
public double cost()
{
return .20 + b.cost();
}
}
答案 0 :(得分:2)
好吧,在您发布的示例中,它不是那么清楚,但是抽象类通常负责组件封装,默认方法实现是将方法调用委托给该组件。
因此,在实施混凝土装饰时,如果您不需要,则不必覆盖所有方法。
e.g。
public abstract class CondimentDecorator extends Beverage {
Beverage beverageToDecorate;
public CondimentDecorator(Beverage beverageToDecorate) {
this.beverageToDecorate = beverageToDecorate;
}
public String getDescription() {
return beverageToDecorate.getDescription();
}
public double cost() {
return beverageToDecorate.cost();
}
}
答案 1 :(得分:1)
为什么摩卡不能简单地延长饮料?另一层抽象需要什么?
问题是如何处理这些组合。 Mocha
只是一个变种,但是Mocha + House Blend + Steam Milk等等。在设计解决方案的第81页上只有这个"层"其中有很多类继承自Beverage
,这是一场维护噩梦。"
CondimentDecorator
允许在Beverage
到组合而不是继承中添加任意数量的组合。