oop - Head First 设计模式 - 使用 Starbuzz 的装饰器模式

标签 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();
   }
}

最佳答案

嗯,在您发布的示例中,情况并不那么清楚,但抽象类通常负责组件封装,默认方法实现是将方法调用委托(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/

相关文章:

java - 实现请求响应设计

java - 设计模式 - 向特定观察者发送通知

Python装饰器理论

python - 一个简单的卡住行为装饰器

reactjs - 使用 react-app-rewired : server start error 升级到 create-react-app 版本 4.0

java - 面向对象 : new class implementing requires additional parameter

javascript - 如何在 javascript 中扩充父类(super class)中的方法

c++ - 在基类中转发声明嵌套结构

json - 如何在模型类中映射动态属性(Swift)

php - 构造函数注入(inject)与方法注入(inject)