【发布时间】:2015-04-17 19:22:14
【问题描述】:
我有一个装饰器类,它基本上围绕着一个名为 Drink(咖啡饮料)的类。你可以用一杯浓缩咖啡、巧克力、焦糖来装饰你的饮料。我知道如何实现这一点,并且我做了一个非常基本的装饰器实现。
如何更改我的鲜奶油类以确保它只能添加到饮料中一次?
public class WCream extends DrinkDecorator
{
private final String TYPE = "Whipped Cream";
private final double COST = 1.00;
private Drink drink;
public WCream(Drink d)
{
this.drink = d;
}
public String getType()
{
return drink.getType() + ", " + TYPE;
}
public double cost()
{
return COST + drink.cost();
}
}
这是我尝试实现 Singleton 以使其工作的方式,这可以避免重复的生奶油,但它会跳过我添加的下一个东西......所以如果我在生奶油之后添加巧克力,它不会'不加巧克力。
然后,在我使用的测试器类中
myDrink = WCream.getUniqueInstance(myDrink);
//instead of
myDrink = new WCream(myDrink);
这是我为其他装饰器所做的方式。
public class WCream extends DrinkDecorator
{
private final String TYPE = "Whipped Cream";
private final double COST = 1.00;
private Drink drink;
private static Wcream uniqueInstance;
public WCream(Drink d)
{
this.drink = d;
}
public static WCream getUniqueInstance(Drink d)
{
if(uniqueInstance == null)
uniqueInstance = new WCream(d)
return uniqueInstance;
}
public String getType()
{
return drink.getType() + ", " + TYPE;
}
public double cost()
{
return COST + drink.cost();
}
}
【问题讨论】:
-
1.我打赌 DrinkDecorator 实现或扩展了 Drink,对吧? 2. 我不会称之为“单例”,而是装饰器上的一个条件。
-
使用
DrinkBuilder为您处理这些情况。 -
是的。有人建议我“修改单例”以使其工作,但这也有效。我不想在测试仪中通过询问我是否已经添加了生奶油来修复它。我想让饮料知道我有没有。
-
@DavidGrinberg 这是因为它可以动态添加。这就是Decorator Pattern 的目的。
-
编辑了我原来的问题以包含更多信息。