错误地使用了Head First Book的装饰模式?

时间:2017-07-23 12:55:02

标签: java design-patterns decorator builder

目前我正在阅读“Head First Design Patterns”。正如您在PDF here的第24页和第25页上看到的那样,我对这个例子表示怀疑。

为什么我们不这样做:

public abstract class Beverage {

String description = "Unknown Beverage";
Double cost;
ArrayList<Topping> toppings;  // allows duplicates


public void addTopping(Topping topping){
toppings.add(topping);
cost+=topping.getCost();
}
getter/setter of description
getter/setter of cost
}



Public class Topping{
 String description;
 double cost;

    getter/setter of description
    getter/setter of cost

}

然后在第25页回答问题:

  • 调味品的价格变动将迫使我们改变现有代码

    不,我们不能通过setter操纵顶部成本。

  • 新的调味品将迫使我们添加新方法并改变超类中的成本方法

    不,方法是一样的。

  • 如果客户想要双摩卡怎么办?

    不是问题

在这里我们还可以添加Builder模式。

为什么要在这种情况下使用装饰器模式?我的解决方案还不够吗?

1 个答案:

答案 0 :(得分:0)

您的解决方案不会使饮料与打顶无关。在我看来,这是设计选择的问题,但装饰模式将确保您的类永远不需要彼此了解。此外,您实施更改的风险更高,从而导致代码更改。在本书的后面(它是一本优秀的书),你会发现你希望每个班级都有一份工作,并且尽可能少知道其他课程。

我仍然会选择装饰师,虽然在这样一个简单的例子中很难看到它的好处。