2013-05-10 16 views
5

のリスナーを実装私はクラスMyClassのインスタンスがたくさん持っており、彼らはALLは別のクラスMyEventClassからいくつか生成されたイベントに反応しなければなりません。私はこれをどのようにするべきですか?私が最初に考えクラスの代わりに、インスタンス

MyClassでそれをMyEventClassでリスナーを定義し、実装することでしたが、これは、リスナーを設定するMyClassのすべてのインスタンスのために必要となり、それに加えてMyEventClassで配列としてリスナーを定義します。
多くのコード/作業。

思った別のオプションは、MyClassMyEventClassと受信機で放送を使用することですが、私はわからない、多分overkilling、及び受信機が(onStop()上および未登録)にも登録されているされて

第三オプションは、インスタンスごとにではなく、クラスMyClassのリスナ実装を定義することです。これは完全に適合するでしょうが、それが可能かどうか、どうやってコーディングするのか分かりません。

しかし、私はちょうど思い付いた4番目のオプションは、MyClassの親クラスでリスナーを実装するだけMyEventClassでこのリスナーを設定し、イベント発生ループ上のすべてのMyClassのインスタンスを通って、手動でリスナーを呼び出すことです。これにより、各インスタンスをMyEventClassで登録する手間が省けます。私はObserver design patternはあなたの最良の選択になると思い

答えて

0

StinePikeが、これはコーディング時に遭遇することは非常に標準問題であり、このいずれかの権利です。 Observer(またはJava TalkのListener)パターンは、これに対する標準的なプラクティスの解決策です。あなたはあなたの最初の命題を使用するべきです、あなたが不明確な言葉をしたので、私があまりにも明確でない場合に備えて、あなたのためにそれをレイアウトします。

MyEventClassには、MyEventClassListenerのようなListenerインターフェイスを提供し、メソッドを追加/削除します。その後、MyClassはリスナーとして自分自身をアタッチ/デタッチできます。

MyEventClass.java

public class MyEventClass { 

    private Set<MyEventClassListener> listeners = new HashSet<MyEventClassListener>(); 

    // Your code here... 

    public void addListener(MyEventClassListener listener) { 
     listeners.add(listener); 
    } 

    public void removeListener(MyEventClassListener listener) { 
     listeners.remove(listener); 
    } 

    public void notifyListeners() { 
     for (MyEventClassListener listener : listeners) { 
      listener.somethingHappened(); 
     } 
    } 

} 

MyEventClassListener.java

public interface MyEventClassListener { 

    public void somethingHappened(); 

} 

MyClassの:ここではあなたがそれを必要とする場合のコード例です。java

public class MyClass implements MyEventClassListener { 

    MyEventClass myEventClass; 

    // Your code here.. 

    public void someFunction() { 
     // Add as listener 
     myEventClass.addListener(this); 
    } 

    @Override 
    public void somethingHappened() { 
     // Act on callback 
    } 

} 
+0

だから、怠惰なプログラマーのための休憩はありません! – ilomambo

+0

避けることができないことを避けることはできません:) –

3

..

オブザーバーパターンは、オブジェクト、 が対象と呼ばれるデザインパターンでその扶養家族のリストを保持 オブザーバーと呼ばれ、通常、いずれかのメソッドを呼び出すことによって、状態の変更を自動的に通知します。 これは主にあなたがこれらのlink1を確認することができ、他のリンクの何千ものシステム

を扱う分散イベントを実装するために使用され、link2

+0

ObserverとBroadcastReceiverとの違いは? => Observer == Receiver、ObserverCollection == EventClass、notify()== sendBroadcast()、そしてobserversはReceiversと同じように登録する必要があります。 – ilomambo

+0

いいえコンセプトが違っています。これを確認してくださいhttps://sites.google.com/site/cliangusf/courses/mobile-programming/exploring-broadcast-receivers – stinepike

+1

正直言って私は違いは見えませんが、答え0はそう言います。また、「Observerのパターンが違う、被験者がオブザーバーのリストを登録し、被験者が変化を起こしたときに被験者にすべてのオブザーバーに通知する」* BroadcastReceiverでも正確にできることですが、BroadcastReceiverはObserver-Pattern 。いずれにせよ、それは私が描く可能な選択肢の一つであり、私はあなたが他の人よりもその方法を推薦すると言います、有効な助言、ありがとう。 – ilomambo

関連する問題