【发布时间】:2014-04-08 07:28:04
【问题描述】:
我正在学习使用装饰器模式,遇到了一个我认为很简单但似乎找不到答案的问题。 假设我有一个抽象的 Beverage 类。然后假设我有一些扩展饮料的具体组件:美式咖啡、浓缩咖啡、拿铁咖啡等。还有一个扩展饮料的抽象调味品类。 Condiments 类有多个子类:牛奶、糖、大豆、鞭子。每个调味品子类都有一个分别从 Beverage 和 Condiments 继承的 cost 和 getdescription() 方法。我的问题是,我如何阻止某个 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();
}
DarkRoast 类
public class DarkRoast extends Beverage {
public DarkRoast() {
description = "Dark Roast Coffee";
}
public double cost() {
return .99;
}
}
大豆类
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
public double cost() {
return .15 + beverage.cost();
}
}
如果有人可以帮助我,甚至可以为我提供一篇好的文章或教程,我将不胜感激。
【问题讨论】:
-
您要求为装饰器提供一种idempotence(至少是那些修改 cost() 的)。
标签: java design-patterns decorator