gpt4 book ai didi

design-patterns - Head First 设计模式 - 装饰器模式描述/成本

转载 作者:行者123 更新时间:2023-12-02 01:12:34 24 4
gpt4 key购买 nike

我对 OO 设计模式很陌生,对 Java 也比较陌生。

我的问题是关于 Head First Designer Patterns Starbuzz 示例中的 Decorator 示例。

我无法理解外层包装器如何调用内层包装器,尤其是这些示例中的描述是如何连接起来的。

例如:

这是摩卡类(装饰):

public class Mocha extends CondimentsDecorator {

Beverage beverage;

public Mocha(Beverage beverage) {

this.beverage = beverage;
}

public String getDescription()
{
return beverage.getDescription() + " , Mocha";
}

public double cost()
{
return .20 + beverage.cost();
}

}

这是 Beverage 类(基础):

public abstract class Beverage {

String description = "Unknown Beverage";

public String getDescription()
{

return description;
}

public abstract double cost();

}

深色烘焙类:

public class DarkRoast extends Beverage {

public DarkRoast() {
description = "Dark Roast";
}

@Override
public double cost() {

return .99;
}

}

所以,如果我运行这个:

 Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);

System.out.println(beverage2.getDescription() + " $" + beverage2.cost());

输出是:

Dark Roast , Mocha , Mocha $1.39

我不明白描述和成本是如何加在一起的?如何保持描述和成本的状态?我在这里遗漏了什么明显的东西吗?

最佳答案

如果您不重复使用名称,将会有所帮助。

有意义的名称示例

假设您将代码编写为:

Beverage roast = new DarkRoast();
mocha = new Mocha(roast);
doubleMocha = new Mocha(mocha);
System.out.println(doubleMocha.getDescription() + " $" + doubleMocha.cost());

变量 mocha 是摩卡咖啡,mocha.beverage == roast 是 DarkRoast。

变量 doubleMocha 是摩卡咖啡,doubleMocha.beverage == mocha 是摩卡咖啡。

请注意 doubleMocha.beverage.beverage == roast。成本也可以委托(delegate)给链条:

dobleMocha.cost() == .20 + doubleMocha.beverage.cost() 
== .20 + mocha.cost()
== .20 + .20 + mocha.beverage.cost()
== .20 + .20 + roast.cost()
== .20 + .20 + 1.99 = 2.39

你可以用同样的方法计算出 doubleMocha.description()

其他问题

随着您的进步,您会学到更多东西。

  1. 装饰器在 Java IO 中被大量使用。一个将 InputReaders 包装在 BufferedInputReaders 中,然后可能在更奇特的类中。
  2. 切勿对货币值使用floatdouble。你有没有见过天真的代码的结果,比如对你的 2.99 美元的商品征收 4.5% 的税,并报告为 3.12455 美元?也很容易四舍五入不正确。

阅读更多

如果你能找到以下书籍的二手副本,请购买:

它对这种类型的代码有很好的描述。

垃圾收集器保留引用

顺便说一句,仅使用一个变量名的原始代码之所以有效,是因为首先将变量设置为 DarkRoast 对象。然后例程创建一个使用 DarkRoast 对象的 Mocha 对象,一旦实例变量设置为 Mocha 对象,原始 DarkRoast 仍然很容易访问。垃圾收集器不会处理它。

关于design-patterns - Head First 设计模式 - 装饰器模式描述/成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725365/

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