ウィキペディア(http://en.wikipedia.org/wiki/Decorator_pattern)に示されているコーヒーデコレータの例を使用すると、デコレータだけのメソッドを持つことができます。メソッド "fatContent"と呼ばれます。これは、このタイプのデザインパターンでも可能ですか?そうでない場合は、これを達成するためにどのようなパターンを使用できますか?デコレータ固有のメソッドをJavaで使用するデコレータパターン
答えて
デコレータパターン定義では、インタフェースで定義されている以外のメソッドを追加することはできません。実際には、どのクラスにもメソッドを追加できますが、これらのメソッドが実装インタフェースで定義されていないと、クライアントはこのインタフェースを使用してメソッドを呼び出すことはできません。
問題の簡単な解決策は、いくつかのインターフェイスを定義することです。コーヒーとミルク。次に、両方のインターフェイスを実装するクラスCapuchino
を定義すると、おそらく2つのインスタンス:SimpleCofee
とFoamedMilk
が保持されます。しかし、このソリューションは、デコレータとファサードを組み合わせたものです。
デコレータは、任意の数の特定のメソッドを持つことができます。装飾されたインターフェイスの実装に加えて、デコレータが実装するデコレータ固有のインターフェイスを導入することもできます。
しかし、誰かがそれらのメソッドが存在することを知っている必要があります。したがって、デコレータはメソッドを内部的に呼び出す必要があります。呼び出し側は装飾オブジェクトの代わりにデコレータを使用しています(instanceof
を使用してテストできます)それらのメソッドをチェックしてください。
あなたははこともできますが、あなたはそれがあなたの周りに渡している型と一致しない場合(など何の反射がないと仮定すると)実際に呼び出し方法を順にタイプを知っておく必要があるだろう。 シグネチャが含まれていない場合は、CoffeeDecoractor
を受け取るメソッドは存在しないことがわかります。CoffeeDecorater
にはfatContent
シグネチャが含まれていません。
追加のインターフェイスを作成することもできますが、そのインターフェイスが存在するかどうか(instanceof
)、または特定のシグネチャ(リフレクション)を確認するためにクラスを調べる必要があります。
Javaは、コンパイル時にメソッドが存在することを知っているか、実行時にメソッドをチェックします。
- 1. デコレータパターン - デコレータ
- 2. 拡張メソッド - デコレータパターン
- 3. Pythonデコレータとデコレータパターンの違いは何ですか?
- 4. Netbeansで固有ライブラリを使用する
- 5. 固有でブーストアキュムレータを使用する::ベクトルタイプ
- 6. pythonデコレータはデコレータパターンを厳密に実装していますか?
- 7. java Formatterでのロケール固有のグループ化セパレータの使用
- 8. 固有の種類のクラスでしか使用できないメソッドがある
- 9. Pyinvoke @taskデコレータで複数のデコレータを使用する
- 10. クラス固有のset_new_handlerを使用
- 11. Fortranでmkl lapackライブラリを使用した固有値と固有ベクトル
- 12. 抽象メソッドのデコレータ
- 13. MVC3でアプリケーション固有のオブジェクトを使用するには?
- 14. ページ固有のjavascriptとcssでpjaxを使用する
- 15. Windows固有のRcppの使用
- 16. バージョン固有のスタブの使用
- 17. 固有クラスのRubyクラスメソッドとメソッド
- 18. バージョン固有のAndroid APIとメソッド
- 19. 非固有キーを使用したダイレクトアドレステーブル
- 20. Mac OS Xバージョン固有のAPI使用
- 21. 関数とメソッドで同じデコレータ(引数付き)を使用する
- 22. javaでデータベース固有のデータ型を取得する方法は?
- 23. デコレータから装飾されたメソッドを所有するクラスへのアクセス
- 24. Django:他のデコレータの中でlogin_requiredデコレータを再利用する
- 25. スリフトサービスでJava固有のタイプを使用するにはどうすればよいですか?
- 26. モバイルOS固有のウィジェットを使用する
- 27. Java、Base64:デコレータパターンを使用してBase64OutputStreamクラスを書き込む方法
- 28. ページ固有のアンカータグをdocusign(Java)で作成できますか?
- 29. Python:デコレータ固有の引数(ラップされた関数とは無関係)?
- 30. rablにデコレータを使用する
私はそのデザインパターンを知らなかった。正直なところ、私はそれが好きではありません。 –
@MartijnCourteauxウィキペディアのコーヒーの例は、[Your Brain On Design Patterns](http://headfirstlabs.com/books/hfdp/)の本から抜粋したものです。しかしそれは、それ以上の説明なしに、ちょっとした部分しか含んでいません。私はパターンの包括的な見方についてこの講演をお勧めします。 – Beccari
@MartijnCourteaux Decorator ?!これは、IMOの最も有用なパターンの1つです。 –