私は 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
助けてくれてありがとう!