我正在阅读《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();
}
}
最佳答案
嗯,在您发布的示例中,情况并不那么清楚,但抽象类通常负责组件封装,默认方法实现是将方法调用委托(delegate)给该组件。
因此,在实现具体装饰器时,如果不需要,则不必重写所有方法。
例如
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();
}
}
关于oop - Head First 设计模式 - 使用 Starbuzz 的装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28269262/