2009-08-08 6 views
4

私はデコレータパターンが最も混乱していることがわかりました。 「ヘッドファーストデザインパターンブック」の例を参考にしてください。デコレータパターンの代わりに

alt text

だから、ダブルモカと鞭でDarkRoastを得るために、私は、これは不要であると感じ

Beverage beverage2 = new DarkRoast(); 
beverage2 = new Mocha(beverage2);          
beverage2 = new Mocha(beverage2);          
beverage2 = new Whip(beverage2); 

を記述する必要があります。ここに私の実装は、

interface Beverage 
{ 
    int Cost(); 
} 

class DarkRoast : Beverage 
{ 
    /* .... */ 
} 

class Mocha : Beverage 
{ 
    /* .... */ 
} 

class Whip : Beverage 
{ 
    /* .... */ 
} 

// here is the changed part 
class Order 
{ 
    List<Beverage> beverages = new List<Beverage> beverages(); 
    public void AddItem(Beverage b) 
    { 
     beverages.Add(b); 
    } 

    public int Cost() 
    { 
     int cost; 
     foreach(Beverage b in beverages) 
      cost += b.Cost(); 
    } 
} 

// use it like 
Order order = new Order(); 
order.AddItem(new DarkRoast()); 
order.AddItem(new Mocha()); 
order.AddItem(new Mocha()); 
order.AddItem(new Whip()); 
int cost = order.Cost(); 

IMO、どちらも同じです。はいの場合、ここでデコレータパターンを使用する利点は何ですか?

どのような考えですか?

答えて

16

いいえ、それらは同じではありません。

頭の最初の例には、Mocha、Whip、Roastを加えた1つの飲み物があります。あなたの例は3つの飲み物を持っています。
この先頭のコードを参照してください。それはあなたのコードは(誰かが個別に3つの事を命じた意味)3つの飲料を作成する飲料

beverage2 = new Mocha(beverage2);          
beverage2 = new DarkRoast(beverage2);          
beverage2 = new Whip(beverage2); 

の同じインスタンス上で動作します。
実生活では、飲み物ではありません。飲み物は、その上に1つの&のフレーバーが加えられています。

デコレータの目的は、装飾することです。 .NetにはTextWriterとIndentedTextWriter(私が推測する)があります。これは基本的にあなたの普通のテキストを取り、インデントを適用します。それはあなたがそれを考えるなら、ある意味ではunixパイプに似ています。

input - > tweaks - > tweaked input - >さらに調整 - >さらに微調整された入力。
現在の動作の出力が次の動作のために入力されます。

私はそれをうまく説明したかどうかわかりません。

+0

ありがとうございました。これはそれをうまく説明します。 –

+0

あなたはそれをうまく説明しました。 –

8

デコレータパターン全体のポイントは、継承ではなくオブジェクトの合成によって責任を追加することです。継承は静的で、objです。構成は動的で柔軟性があります。装飾の可能性は無限です。実行時にオブジェクトをデコレーションすることもできます。

+0

あなたは装飾を解除することについてもっと考えてもらえますか? –

1

あなたは実際には全く異なるものを表現していると思います。

あなたの例では、飲料を受け取るオブジェクトコールオーダーがあります。頭の最初の例では、単にトッピングで飲み物を飾っているだけです。これは、以下の主な問題を引き起こします。

注文コードでは、複数の飲料を置くことができます。複数の場合は、それぞれの飲み物にはどのようなトッピングがありますか?