我正在编写Head First Design Patterns一书。 问题: 在starbuzz应用程序上使用Decorator模式为现有代码添加大小
Beverage.Class
package CoffeHouse.drinks;
import CoffeHouse.drinks.sizedBevrage.Size;
/**
* trying to implement decorator pattern and understand why and how it is implemented
* @author praveen
*
*/
public abstract class Bevrage {
Size drinkSize = null;
String description = "Unknown Drink";
public String getDescription(){
return description;
}
public Size getSize(){
return drinkSize;
}
public abstract double cost();
}

Expresso Class
public class Expresso extends Bevrage {
public Expresso(){
this.description = "Expresso";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return 1.19;
}
}

调味品类
package CoffeHouse.condiments;
import CoffeHouse.drinks.Bevrage;
public abstract class CondimentDecorator extends Bevrage{
public abstract String getDescription();
}

摩卡课
package CoffeHouse.condiments;
import CoffeHouse.drinks.Bevrage;
public class Mocha extends CondimentDecorator{
private Bevrage bevrage;
public Mocha(Bevrage be){
this.bevrage = be;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return this.bevrage.getDescription()+",Mocha";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return this.bevrage.cost()+0.15;
}
}

我们被要求编辑此代码,以便添加饮料的大小,并根据大小确定调味品的成本。我遇到的问题是,如果我将尺寸方法添加到饮料抽象类中,则mocha类也会继承它。我不想给摩卡课程改变饮料大小的能力。这是装饰模式的限制还是有解决方法
答案 0 :(得分:1)
你有4类咖啡:
你还有4种调味品,你可以添加到咖啡中:
您实施的唯一方法是getSize()
,因此您没有设定饮品的大小。
所以确实Mocha(以及所有其他调味品类)需要 getSize()
- 方法才能知道饮料的大小。根据这些知识,他们可以定义添加到饮料中的调味品数量的成本。 (参见第3章最后一页的解决方案[Head First Patterns 2014年第二版])
调味品无法设定/更改饮料的大小。因此,有意的是,Mocha继承了getSize()
- 方法,无需解决方法。