首先设计模式 - 使用Starbuzz的装饰模式

时间:2015-02-01 23:38:32

标签: oop design-patterns decorator

我正在阅读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();
   }
}

2 个答案:

答案 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组合而不是继承中添加任意数量的组合。