这是关于代码行为的问题,而不是模式本身的问题。我将在下面列出代码
public abstract class Beverage {
protected String description;
public String getDescription(){
return description;
}
public abstract BigDecimal cost();
}
public abstract class CondimentDecorator extends Beverage{
@Override
public abstract String getDescription();
}
public class HouseBlend extends Beverage{
public HouseBlend() {
description = "House Blend";
}
@Override
public BigDecimal cost() {
return BigDecimal.valueOf(.89);
}
}
public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
System.out.println("desc: " + beverage.getDescription());
return beverage.getDescription() + ", Mocha";
}
@Override
public BigDecimal cost() {
System.out.println("bev: "+beverage.cost());
return BigDecimal.valueOf(.20).add(beverage.cost());
}
}
public class CoffeeTest {
public static void main(String args[]){
Beverage blend = new HouseBlend();
blend = new Mocha(blend);
blend = new Mocha(blend);
blend = new Mocha(blend);
System.out.println(blend.getDescription() + " * "+blend.cost());
}
}
当CoffeeTest运行时,我得到以下输出,我想了解它
1 desc: House Blend
2 desc: House Blend, Mocha
3 desc: House Blend
4 desc: House Blend, Mocha, Mocha
5 desc: House Blend
6 desc: House Blend, Mocha
7 desc: House Blend
8 bev: 0.89
9 bev: 1.09
10 bev: 0.89
11 bev: 1.29
12 bev: 0.89
13 bev: 1.09
14 bev: 0.89
15 House Blend, Mocha, Mocha, Mocha * 1.49
以下是我的问题:
beverage.cost()
是如何通过添加金额来节省状态的。我确信答案在于饮料和CondimentDecorator之间的多态性。
发布于 2010-06-24 15:22:11
如何‘房子混合,摩卡,摩卡’打印时,没有明确的状态保存?
您正在创建3个不同的对象。让我们将它们称为a、b和c。这样我们就可以重写代码,如下所示:
Beverage a = new HouseBlend();
Beverage b = new Mocha(a);
Beverage c = new Mocha(b);
System.out.println(c.getDescription() + " * "+c.cost());
这将与您的代码做同样的事情,但更清楚的是,您正在处理的是3个不同的对象。赋值
blend = new Mocha(blend);
不替换对象,而是实际创建一个新对象,只需将引用混合修改为新对象。
在代码中调用blend.getDescription()时,引用的是对象c,它调用对象b的getDescription,后者调用对象a的getDescription,对象a的getDescription()返回字符串"House Blend“。因此,对象b的getDescription()返回"House Blend,Mocha“。然后,对象c的getDescription()返回"House Blend,Mocha,Mocha“。
getCost()也发生了类似的情况。
发布于 2010-06-24 14:54:26
在Mocha.getDescription中,您有System.out.println,另外,您还可以返回一些内容,也可以在void中打印。不过,我得到了以下几点:
desc:混合住宅
desc:混合屋,摩卡
desc:混合住宅
bev: 0.89
bev: 1.09
bev: 0.89
房屋混合,摩卡,摩卡* 1.29
如果在void中有三次新的Mocha,输出结果与您的类似。
public static void main(String[] args) {
Beverage blend = new HouseBlend();
blend = new Mocha(blend);
blend = new Mocha(blend);
blend = new Mocha(blend);
System.out.println(blend.getDescription() + " * "+blend.cost());
}
装饰器模式的工作原理就像将对象包裹在对象周围--就像:
( HouseBlend has_a (摩卡))
发布于 2010-06-24 14:55:51
在getDescription中,可以两次调用beverage.getDescription(),这两行都是打印行。
https://stackoverflow.com/questions/3111078
复制相似问题