我是OO设计模式的新手,也是Java的新手。
我的问题是关于Head First Designer Patterns example中的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();
}
}下面是Beverage类(基类):
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription()
{
return description;
}
public abstract double cost();
}Dark Roast Class:
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我不明白这些描述是如何构建的,成本又是如何加在一起的?描述和成本的状态是如何保持的?我是不是漏掉了什么明显的东西?
发布于 2013-03-31 09:47:03
如果您不重用名称,这将有所帮助。
有意义的名称示例
假设您已经编写了如下代码:
Beverage roast = new DarkRoast();
mocha = new Mocha(roast);
doubleMocha = new Mocha(mocha);
System.out.println(doubleMocha.getDescription() + " $" + doubleMocha.cost());变量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你可以用同样的方法来理解doubleMocha.description()。
其他问题
随着你的进步,你会学到更多的东西。
floats或doubles表示货币值。你有没有见过简单的代码应用的结果,比如对2.99美元的商品征收4.5%的税,并将其报告为3.12455美元?舍入错误也很容易。阅读更多
如果你能找到下面这本书的二手版本,那就买吧:
它对这类代码有很好的描述。
垃圾收集器保留引用
顺便说一句,只使用一个变量名的原始代码是有效的,因为首先将变量设置为DarkRoast对象。然后,该例程创建一个Mocha对象,该对象使用DarkRoast对象,并且一旦将实例变量设置为Mocha对象,原始DarkRoast仍然是强可达的。垃圾收集器不会处理它。
发布于 2013-03-31 09:32:22
该描述是用
public String getDescription()
{
return beverage.getDescription() + " , Mocha";
}注意,Mocha的描述调用了Beverage类的描述。
成本按以下公式计算
public double cost()
{
return .20 + beverage.cost();
}因此,Mocha类的开销调用Beverage类的开销作为其计算的一部分。
https://stackoverflow.com/questions/15725365
复制相似问题