私はソースを介して SensorManager in Android=を見て、SensorEventListener
を登録するとSensorManager
ListenerDelegate
のリスナー。
例としてこれを取り上げます。私は Wikipediaの記事 デリゲートプログラミングについて読んでいますが、その目的はまだわかりません。なぜ「デリゲート」を使用するのでしょうか?プログラムの制御フローにどのように役立ちますか?使用する(または使用しない)場合の短所は何ですか?リスナーでの使用に最も実用的ですか?
編集:ListenerDelegate
は487行目にあり、問題のメソッドは1054行あたりです。
委任は、GoFブックで使用されている意味での「設計パターン」ではありません。多くのシナリオで有用であり、他のパターンのベースです
Collections.synchronizedList(..)
は、元のコレクションに委任する新しいコレクションを作成しますが、そのメソッドは同期されます。EnumerationIterator
インターフェイスに適応させるIterator
クラスがあります。クラスには、hasNext()
に委任するenumeration.hasMoreElements()
メソッドがあります。Car
はstart()
、openWindow()
、およびbrake()
を持つことができますが、これらの各メソッドは実際にはエンジンelに委任されます。窓およびブレーキシステム( これも参照 )効果的なJava(Joshua Bloch)によると、合成は継承よりも有利です。合成には、継承よりもいくつかの利点があります。これに対する直観の1つは、次のとおりです。サブクラスはベースクラスに依存するため、ベースクラスを変更すると、サブクラスが壊れやすくなります。継承を使用することで、サブクラスにバインディングを作成し、ベースクラスに依存します。しかし、コンポジションを使用すると、この制限を取り除くことができます。コンポジションは、継承のように「is-a」関係ではなく、クラス間に「has-a関係」を確立することで行われます。どちらも構成を実現する方法の例です。有効なJava本の非常に参考になるので、「構成と継承」の章を読むことをお勧めします。
短い説明については、この記事を参照できます。 http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-Java-oops-design.html
デリゲートパターンは、実際に他の誰かに作業を行わせるために使用されるため、たとえば、あなたの例では、SensorManager
はすべてのリスナーが望んでいることを行う方法を知りませんが、1つのプログラムだけがリスニングすることを望みますセンサーに。
そのため、registerListener
でSensorManager
を呼び出して作成されたリスナーがあり、これらのリスナーには情報が渡され、センサーからのデータをどう処理するかを決定できます。