0

私は Decorator パターンを経験してきましたが、理論はかなりよく理解していますが、理解できない技術的な部分が少しだけあります。

デコレーターを追加して、オブジェクトを呼び出すときにすべてのデコレーター関数も呼び出して、動作を変更できることを理解しています (コーヒーに材料を追加するなど)。私が理解していないのは、それがどのように可能であるかです。

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";
    }
}

サブクラスに関係なくコーヒーデコレーターになるスーパークラスのみを参照するため、上記の例では c = new Whip(new Sprinkles(new Milk(c))) 、それはどのようにすべての追加機能を受け取りますか?

説明するのは難しいですが、正確には次のとおりです。

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

継承/集約の観点から作業しますか? 彼らはお互いを通り抜けますか?

完全なプログラムはウィキペディアにあります。使用されている例は私が書いたものではありません。それらはすべて次の場所にあります。

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

助けてくれてありがとう!

4

1 に答える 1

1

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.
于 2013-10-08T16:46:31.603 に答える