首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Head First设计模式-装饰者模式描述/成本

Head First设计模式-装饰者模式描述/成本
EN

Stack Overflow用户
提问于 2013-03-31 09:22:41
回答 2查看 1.3K关注 0票数 2

我是OO设计模式的新手,也是Java的新手。

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

我很难理解外部包装器如何调用内部包装器,特别是这些示例中的描述是如何连接在一起的。

例如:

以下是Mocha类(装饰):

代码语言:javascript
复制
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类(基类):

代码语言:javascript
复制
public abstract class Beverage {

String description = "Unknown Beverage";

public String getDescription()
{

    return description;
}

public abstract double cost();

}

Dark Roast Class:

代码语言:javascript
复制
public class DarkRoast extends Beverage {

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

@Override
public double cost() {

    return .99;
}

}

所以,如果我运行这个:

代码语言:javascript
复制
 Beverage beverage2 = new DarkRoast();
 beverage2 = new Mocha(beverage2);
 beverage2 = new Mocha(beverage2);

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

输出为:

代码语言:javascript
复制
Dark Roast , Mocha , Mocha $1.39

我不明白这些描述是如何构建的,成本又是如何加在一起的?描述和成本的状态是如何保持的?我是不是漏掉了什么明显的东西?

EN

回答 2

Stack Overflow用户

发布于 2013-03-31 09:47:03

如果您不重用名称,这将有所帮助。

有意义的名称示例

假设您已经编写了如下代码:

代码语言:javascript
复制
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。而且成本也可以分配到链的下游:

代码语言:javascript
复制
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中被大量使用。一种是将InputReaders包装在BufferedInputReaders中,然后可能在更奇特的classes.
  2. Never中使用floats或doubles表示货币值。你有没有见过简单的代码应用的结果,比如对2.99美元的商品征收4.5%的税,并将其报告为3.12455美元?舍入错误也很容易。

阅读更多

如果你能找到下面这本书的二手版本,那就买吧:

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

垃圾收集器保留引用

顺便说一句,只使用一个变量名的原始代码是有效的,因为首先将变量设置为DarkRoast对象。然后,该例程创建一个Mocha对象,该对象使用DarkRoast对象,并且一旦将实例变量设置为Mocha对象,原始DarkRoast仍然是强可达的。垃圾收集器不会处理它。

票数 4
EN

Stack Overflow用户

发布于 2013-03-31 09:32:22

该描述是用

代码语言:javascript
复制
public String getDescription() 
{
    return beverage.getDescription() + " , Mocha";
}

注意,Mocha的描述调用了Beverage类的描述。

成本按以下公式计算

代码语言:javascript
复制
public double cost()
{
    return .20 +  beverage.cost();
}

因此,Mocha类的开销调用Beverage类的开销作为其计算的一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15725365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档