ウィキペディア(http://en.wikipedia.org/wiki/Decorator_pattern)に示されているコーヒーデコレータの例を使用すると、デコレータだけのメソッドを持つことができます。メソッド "fatContent"と呼ばれます。これは、このタイプのデザインパターンでも可能ですか?そうでない場合は、これを達成するためにどのようなパターンを使用できますか?デコレータ固有のメソッドをJavaで使用するデコレータパターン
答えて
デコレータパターン定義では、インタフェースで定義されている以外のメソッドを追加することはできません。実際には、どのクラスにもメソッドを追加できますが、これらのメソッドが実装インタフェースで定義されていないと、クライアントはこのインタフェースを使用してメソッドを呼び出すことはできません。
問題の簡単な解決策は、いくつかのインターフェイスを定義することです。コーヒーとミルク。次に、両方のインターフェイスを実装するクラスCapuchino
を定義すると、おそらく2つのインスタンス:SimpleCofee
とFoamedMilk
が保持されます。しかし、このソリューションは、デコレータとファサードを組み合わせたものです。
デコレータは、任意の数の特定のメソッドを持つことができます。装飾されたインターフェイスの実装に加えて、デコレータが実装するデコレータ固有のインターフェイスを導入することもできます。
しかし、誰かがそれらのメソッドが存在することを知っている必要があります。したがって、デコレータはメソッドを内部的に呼び出す必要があります。呼び出し側は装飾オブジェクトの代わりにデコレータを使用しています(instanceof
を使用してテストできます)それらのメソッドをチェックしてください。
あなたははこともできますが、あなたはそれがあなたの周りに渡している型と一致しない場合(など何の反射がないと仮定すると)実際に呼び出し方法を順にタイプを知っておく必要があるだろう。 シグネチャが含まれていない場合は、CoffeeDecoractor
を受け取るメソッドは存在しないことがわかります。CoffeeDecorater
にはfatContent
シグネチャが含まれていません。
追加のインターフェイスを作成することもできますが、そのインターフェイスが存在するかどうか(instanceof
)、または特定のシグネチャ(リフレクション)を確認するためにクラスを調べる必要があります。
Javaは、コンパイル時にメソッドが存在することを知っているか、実行時にメソッドをチェックします。
私はそのデザインパターンを知らなかった。正直なところ、私はそれが好きではありません。 –
@MartijnCourteauxウィキペディアのコーヒーの例は、[Your Brain On Design Patterns](http://headfirstlabs.com/books/hfdp/)の本から抜粋したものです。しかしそれは、それ以上の説明なしに、ちょっとした部分しか含んでいません。私はパターンの包括的な見方についてこの講演をお勧めします。 – Beccari
@MartijnCourteaux Decorator ?!これは、IMOの最も有用なパターンの1つです。 –