2011-06-29 21 views
4

Notifierの変更をリッスンするMyObserverクラスがあります。 NotifierはObservableを拡張し、notifyObservers(Object)でイベントを通知します。引数として渡されるオブジェクトは、常に同じクラスのインスタンスです。問題は、各観察者が異なるイベントを聞く必要があることです。例えば、ある観測者は、変更されたイベントの状態を聞く必要があり、他のオブザーバーは、すべてのタイプのイベントを監視する必要があります。どのように私は観察者のパターンでこれを行うことができますか?オブザーバーの2つのオブザーバー・リストを持つパターン

ありがとうございました。

+0

あなたがObservableを実装しているとします。独自のObservableインターフェースを実装しているのか、java.util.Observableから拡張していますか? – peshkira

+0

あなたが直面している問題はまさに何ですか? – Bohemian

+0

私はjava.util.Observableを実装しています。 –

答えて

3

あなたがデザインを少し変更することができる場合:

interface MyObserver { 
    public void stateChangeEvent(); 
    public void otherEvent(); 
} 

class MyObserverAdapter implements MyObserver { 
    public void stateChangeEvent() { 
     // some default implementation or no implementation. 
    } 

    public void otherEvent() { 
     // some default implementation or no implementation. 
    } 
} 

class MyStateChangeObserver extends MyObserverAdapter { 
    public void stateChangeEvent() { 
     // implement behavior specific to this class. 
    } 
} 

class MyOtherObserver extends MyObserverAdapter { 
    public void otherEvent() { 
     // implement behavior specific to this class. 
    } 
} 

使用法:

MyObserver stateObserver = new MyStateChangeObserver(); 
MyObserver otherObserver = new MyOtherObserver(); 
notifier.notifyObservers(stateObserver); 
notifier.notifyObservers(otherObserver); 
+0

ニース。私はMyObserverAdapterを削除することができますので、デフォルトの実装はありません。しかし、私がそれを取り除くと、どのようにして一つの出来事だけを聞くことができ、すべてを聞くことができないでしょうか?たぶん私はアダプタクラスが必要です。 –

+0

@Davidアダプタは、他の2つのクラスで必要なメソッドだけを実装する必要があるので、依然として有用かもしれません。 –

+0

あなたの使用例を本当に理解していません。メインクラス(オブザーバー)はMyStateChangeObserverを実装する必要がありますか? –

5

バージョンnotifyObservers(Object arg)を使用して、ある種の「イベントタイプ」オブジェクトを作成してそこに固定します。あなたの観測クラスでは、渡されたイベントクラスを単にフィルタリングします。

public void update(Object observable, Object arg) { 
    if ((MyEvent) arg.isEventX()) { /* do stuff */ } 
} 
+0

私は簡単な例を教えてください。 –

+0

私は、イベントクラスについての小さな例を意味しますが、あなたの例に感謝します。 –

0

あなたが観測クラスで次の作業を実行して、状態変化のためにテストすることができます。

public void update(Observable o, Object arg) 
{ 
    if(o.hasChanged()) 
    { 
     // do something 
    } 
} 

このテストが必要ないものは何でもあります。これはおそらく、状態の変化だけを聞きたい場合は、最も簡単な方法です。

5

オブザーバーパターンのJava組み込み実装があなたのケースに適していないと思います。

実際、観察可能な種類のイベントが1つしか発生しない場合は、一般的なオブザーバパターンを使用できます。オブザーバーデザインパターンでは、すべてオブザーブズはを常にに通知します。

ので、この場合には、あなたは、たとえば、あなた自身の観察可能なインタフェースを定義することにより、このように一般的なObserverパターンを拡張する必要があります。

public enum EventKind { 
    EVENT_A, EVENT_B, EVENT_C; 
} 

public interface Observable { 
    public void registerObserver(EventKind eventKind); 
    public void unregisterObserver(EventKind eventKind); 
    public void notifyObservers(EventKind eventKind); 
} 

次に、あなただけでこの観察可能なインタフェースを実装することができます通知するイベントの種類ごとの内部リスト。必要に応じて、Java組み込みのObserverインターフェースを引き続き使用できます。

このアプローチには、次の利点があります。

  1. あなたは柔軟 オブザーバーのコードに影響を与えることなく、イベント のより多くの種類を追加することができます。
  2. イベントにオブザーバーを登録することができます。
  3. あなたは で効果的に興味を持って各イベントですだけオブザーバー を更新します。
  4. Observers側では、「空のメソッド」、「イベントタイプのチェック」、その他 のトリックは避けてください。
関連する問題