gpt4 book ai didi

java - 装饰器模式,子类通过其他子类运行以获得行为?

转载 作者:行者123 更新时间:2023-12-01 14:03:30 26 4
gpt4 key购买 nike

我一直在研究装饰器模式,并且非常了解其理论,但是只有一个轻微的技术部分我无法理解。

我知道您可以添加装饰器,这样当您调用一个对象时,它也会调用所有装饰器函数,以便它们可以更改行为(例如向咖啡添加成分)。我不明白的是它怎么可能。

Coffee c = new SimpleCoffee();

c = new Whip(new Sprinkles(new Milk(c)));
System.out.println("Cost: " + c.getCost() + "; Ingredients: " + c.getIngredients());

通过使用装饰器类,这会增加函数的额外成本和成分:Milk、Whip 和 Sprinkles。然而,这个单独的实现是这样的:

class Milk extends CoffeeDecorator {
public Milk (Coffee decoratedCoffee) {
super(decoratedCoffee);
}

public double getCost() {
return super.getCost() + 0.5;
}

public String getIngredients() {
return super.getIngredients() + ingredientSeparator + "Milk";
}
}

我没有看到它们在任何地方互相引用,它们只引用父类(super class),无论子类如何,都将是咖啡装饰器,所以在上面的示例中,c = new Whip(new Sprinkles(new Milk(c ))),它如何接收所有额外的功能?

这很难解释,但具体是如何做到的:

c = new Whip(new Sprinkles(new Milk(c)))

在继承/聚合方面工作?它们相互贯穿吗?

完整的程序位于维基百科,我没有编写任何使用的示例,它们都可以在以下位置找到:

http://en.wikipedia.org/wiki/Decorator_pattern

感谢您的帮助!

最佳答案

Milk、Whip 等类扩展了 CoffeeDecorator。该类在其构造函数中采用 Coffee 对象。看一下ConcreteDecorator类中getCost的实现。它只调用装饰类中的 getCost 操作。

所以当你有这样的层次结构时:

c = new Whip(new Sprinkles(new Milk(c)))

然后运行:

c.getCost();

操作顺序是这样的:

The Whip instance runs the super.getCost() - in fact calling sprinkles.getCost()
The sprinkles.getCost() runs **its** super.getCost() - in fact calling Milk.getCost()
...
The coffee object returns 1
...
The sprinkles object adds its cost to that
The whip object adds its cost to the result.

关于java - 装饰器模式,子类通过其他子类运行以获得行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19130359/

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