Qua*_*ade 2 design-patterns decorator
我对 OO 设计模式相当陌生,对 Java 也比较陌生。
我的问题是关于 Head First Designer Patterns Starbuzz 示例中的 Decorator 示例。
我无法理解外部包装器如何调用内部包装器,以及具体如何连接这些示例中的描述。
例如:
这是 Mocha 类(装饰):
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是饮料类(基础):
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription()
{
return description;
}
public abstract double cost();
}
Run Code Online (Sandbox Code Playgroud)
深度烘焙等级:
public class DarkRoast extends Beverage {
public DarkRoast() {
description = "Dark Roast";
}
@Override
public double cost() {
return .99;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我运行这个:
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
Run Code Online (Sandbox Code Playgroud)
输出是:
Dark Roast , Mocha , Mocha $1.39
Run Code Online (Sandbox Code Playgroud)
我不明白这些描述是如何构建的,成本是如何加在一起的?描述和成本的状态如何保存?我在这里遗漏了一些明显的东西吗?
如果您不重复使用名称,将会有所帮助。
假设您将代码编写为:
Beverage roast = new DarkRoast();
mocha = new Mocha(roast);
doubleMocha = new Mocha(mocha);
System.out.println(doubleMocha.getDescription() + " $" + doubleMocha.cost());
Run Code Online (Sandbox Code Playgroud)
变量mocha是 Mocha,并且mocha.beverage == roast是 DarkRoast。
变量doubleMocha是 Mocha,并且doubleMocha.beverage == mocha是 Mocha。
注意doubleMocha.beverage.beverage == roast。并且成本也可以向下委托:
dobleMocha.cost() == .20 + doubleMocha.beverage.cost()
== .20 + mocha.cost()
== .20 + .20 + mocha.beverage.cost()
== .20 + .20 + roast.cost()
== .20 + .20 + 1.99 = 2.39
Run Code Online (Sandbox Code Playgroud)
doubleMocha.description()你也可以用同样的方法算出来。
随着你的进步,你会学到更多的东西。
floats 或doubles 表示货币值。您是否见过简单代码的结果,例如对 2.99 美元的商品征收 4.5% 的税,并将其报告为 3.12455 美元?也很容易错误地四舍五入。如果您能找到以下书籍的二手书,请购买:
它对此类代码有很好的描述。
顺便说一句,仅使用一个变量名称的原始代码可以工作,因为首先将变量设置为DarkRoast对象。然后例程创建一个Mocha使用该DarkRoast对象的对象,一旦将实例变量设置为该Mocha对象,原始对象DarkRoast仍然是强可达的。垃圾收集器不会处理它。