web-dev-qa-db-ja.com

委任パターンの目的は何ですか?

私はソースを介して SensorManager in Android=を見て、SensorEventListenerを登録するとSensorManagerListenerDelegateのリスナー。

例としてこれを取り上げます。私は Wikipediaの記事 デリゲートプログラミングについて読んでいますが、その目的はまだわかりません。なぜ「デリゲート」を使用するのでしょうか?プログラムの制御フローにどのように役立ちますか?使用する(または使用しない)場合の短所は何ですか?リスナーでの使用に最も実用的ですか?

編集:ListenerDelegateは487行目にあり、問題のメソッドは1054行あたりです。

43
ahodder

委任は、GoFブックで使用されている意味での「設計パターン」ではありません。多くのシナリオで有用であり、他のパターンのベースです

  • デリゲートの前後に追加のアクションを実行する場合(デコレーターパターンですが、デリゲーションに基づいています)。たとえば、Collections.synchronizedList(..)は、元のコレクションに委任する新しいコレクションを作成しますが、そのメソッドは同期されます。
  • 互換性のないインターフェースがあり、一方を他方に適合させたい場合(アダプターパターン)。元のオブジェクトを取得し、目的のインターフェイスに準拠するメソッドからオブジェクトに委任します。たとえば、列挙をEnumerationIteratorインターフェイスに適応させるIteratorクラスがあります。クラスには、hasNext()に委任するenumeration.hasMoreElements()メソッドがあります。
  • クラスのユーザーから複雑さを隠したい場合、実際のさまざまなワーカーに委任するメソッドを使用できます。たとえば、Carstart()openWindow()、およびbrake()を持つことができますが、これらの各メソッドは実際にはエンジンelに委任されます。窓およびブレーキシステム( これも参照
61
Bozho

効果的なJava(Joshua Bloch)によると、合成は継承よりも有利です。合成には、継承よりもいくつかの利点があります。これに対する直観の1つは、次のとおりです。サブクラスはベースクラスに依存するため、ベースクラスを変更すると、サブクラスが壊れやすくなります。継承を使用することで、サブクラスにバインディングを作成し、ベースクラスに依存します。しかし、コンポジションを使用すると、この制限を取り除くことができます。コンポジションは、継承のように「is-a」関係ではなく、クラス間に「has-a関係」を確立することで行われます。どちらも構成を実現する方法の例です。有効なJava本の非常に参考になるので、「構成と継承」の章を読むことをお勧めします。

短い説明については、この記事を参照できます。 http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-Java-oops-design.html

17
Rookie

デリゲートパターンは、実際に他の誰かに作業を行わせるために使用されるため、たとえば、あなたの例では、SensorManagerはすべてのリスナーが望んでいることを行う方法を知りませんが、1つのプログラムだけがリスニングすることを望みますセンサーに。

そのため、registerListenerSensorManagerを呼び出して作成されたリスナーがあり、これらのリスナーには情報が渡され、センサーからのデータをどう処理するかを決定できます。

6
James Black