gpt4 book ai didi

java - Head First 设计模式 : Decorator behavior puzzling

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:34 25 4
gpt4 key购买 nike

这是关于代码行为而不是模式本身的问题。我将在下面列出代码

  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

所以这些是我的问题:

  1. 我希望“desc”和“bev”打印 3 倍,为什么要打印 xtra 行?
  2. 当没有明确保存状态时,如何打印“House Blend、Mocha、Mocha”?
  3. 我对“成本”有同样的问题,beverage.cost() 如何通过添加金额来保存状态。

我确信答案在于 Beverage 和 CondimentDecorator 之间的多态性。

最佳答案

How is 'House Blend, Mocha, Mocha' printed when there is no explicit state saved?

您正在创建 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,而对象 b 又调用对象 a 的 getDescription。对象 a 的 getDescription() 返回字符串“House Blend”。因此,对象 b 的 getDescription() 返回“House Blend, Mocha”。然后对象 c 的 getDescription() 返回“House Blend、Mocha、Mocha”。

getCost() 发生了非常相似的事情。

关于java - Head First 设计模式 : Decorator behavior puzzling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3111078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com