"Head First:Design Patterns"ブックのデコレータパターンユースケースは私にこの質問をしました。私はそれを書き留めてみます:デコレータパターンの代わりにリストを使用しますか?
は、それはあなたが(余分なコストのために)それらに置くことができる いくつかのコーヒーや調味料の多いコーヒーショップシステムです、あなたは を注文できるようにする必要がありますし、 (例えば、 調味料を追跡するブーリアン)デコレータパターンが使用されていることを避けるためには、 を使用してください。
だから、我々は次のプロセスはコーヒーの費用を返している:私たちは、抽象飲料 クラス、具体的な構成要素として、コーヒーや各調味料、このような飲料を包む などの具体的なデコレータ、それぞれのタイプを持っています:
私の質問は:なぜ、代わりにデコレータのリストでこれを実装していませんか?各飲料に調味料のリストを用意し、リストを繰り返してコストを計算することができます。以下のような宣言を避け、我々は一度だけ、それをインスタンス化し、必要な調味料を追加する必要がありますコーヒーを注文するには:それに加えて
// Using second image example
Beverage beverage = new DarkRoast(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
を我々はそれの調味料を含まないコーヒーのための割引を与えるような操作のためのより多くの柔軟性を持っているでしょうコーヒーを包み込むデコレータは一度もありません。これは長い間研究されてきた問題です。私は何かが欠落しているか、何か間違っていることを知っています。あなたがこれについて何か考えているなら、それをもっと知り、さらに議論することが大好きです。
これは、減算するか、または追加する必要がある割引や税金のリストではありません。これは、デコレータパターンで処理している動作についてです。そして、私を信じて、継承の代わりにリストでその行動を扱うのは難しいです。 – freedev
このケースを使用した例はありますか?あるいは、別のランダムなケースですか?私は本当にこれが起こる状況を想像することはできません。 – Paternostro
これは[softwareengineering.stackexchange.com](https://softwareengineering.stackexchange.com)の方が良いようです。個人的には、それはデコレータのひどい使い方だと思います(ウィキペディアにもそのような例があります)、リストを使ってもっと管理しやすい方法で絶対に解決することができます。 'java.io.InputStream'は、うまく動作するDecoratorの例です。しかし、あなたはすでに私に同意しないユーザーがいることを知ることができます。だから、これはおそらくSOの話題ではありません。 – Radiodef