首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >头第一设计模式:装潢者行为困惑

头第一设计模式:装潢者行为困惑
EN

Stack Overflow用户
提问于 2010-06-24 14:48:42
回答 3查看 477关注 0票数 3

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

代码语言:javascript
运行
复制
  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运行时,我得到以下输出,我想了解它

代码语言:javascript
运行
复制
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. I期望'desc‘和'bev’打印3x,那么为什么要打印xtra行呢?在没有显式状态保存的情况下,
  2. 如何打印'House
  3. ,Mocha,Mocha‘?
  4. I有一个关于“成本”的问题,beverage.cost()是如何通过添加金额来节省状态的。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-24 15:22:11

如何‘房子混合,摩卡,摩卡’打印时,没有明确的状态保存?

您正在创建3个不同的对象。让我们将它们称为a、b和c。这样我们就可以重写代码,如下所示:

代码语言:javascript
运行
复制
Beverage a = new HouseBlend();
Beverage b = new Mocha(a);
Beverage c = new Mocha(b);
System.out.println(c.getDescription() + " * "+c.cost());

这将与您的代码做同样的事情,但更清楚的是,您正在处理的是3个不同的对象。赋值

代码语言:javascript
运行
复制
blend = new Mocha(blend);

不替换对象,而是实际创建一个新对象,只需将引用混合修改为新对象。

在代码中调用blend.getDescription()时,引用的是对象c,它调用对象b的getDescription,后者调用对象a的getDescription,对象a的getDescription()返回字符串"House Blend“。因此,对象b的getDescription()返回"House Blend,Mocha“。然后,对象c的getDescription()返回"House Blend,Mocha,Mocha“。

getCost()也发生了类似的情况。

票数 4
EN

Stack Overflow用户

发布于 2010-06-24 14:54:26

在Mocha.getDescription中,您有System.out.println,另外,您还可以返回一些内容,也可以在void中打印。不过,我得到了以下几点:

desc:混合住宅

desc:混合屋,摩卡

desc:混合住宅

bev: 0.89

bev: 1.09

bev: 0.89

房屋混合,摩卡,摩卡* 1.29

如果在void中有三次新的Mocha,输出结果与您的类似。

代码语言:javascript
运行
复制
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());
}

装饰器模式的工作原理就像将对象包裹在对象周围--就像:

( HouseBlend has_a (摩卡))

票数 0
EN

Stack Overflow用户

发布于 2010-06-24 14:55:51

在getDescription中,可以两次调用beverage.getDescription(),这两行都是打印行。

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

https://stackoverflow.com/questions/3111078

复制
相关文章

相似问题

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