这是一个关于代码行为的问题,而不是模式本身。我会制定出下面的代码首先设计模式:装饰行为令人费解
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
所以这是我的问题:
- 我的预期'desc'和'bev'将被打印3倍,为什么xtra行?
- 当没有明确的状态保存时,“House Blend,Mocha,Mocha”如何打印?
- 我对'成本'有同样的问题,
beverage.cost()
如何通过添加金额来保存状态。
我确信答案在于Beverage和CondimentDecorator之间的多态性。
我没有在这里看到装饰模式的用法 – 2010-06-24 14:57:29
为什么不呢?这是文档:饮料混合=新HouseBlend();混合=新摩卡(混合);混合=新摩卡(混合); – OlimilOops 2010-06-24 15:06:27
您是否尝试清洁该项目? – JRL 2010-06-24 15:07:10