2012-04-02 14 views
1

MVPデザインパターンを使用しています。私は、プレゼンターを様々なボタンや他のインタラクティブな要素にリスナーとして登録しています。これはうまくいきますが、ユーザーがGUIで何らかのアクションを実行するたびに通知されます。モデルが変更されたことを発表者に通知する

ただし、モデルが変わったときに発表者に通知する手順はありません。私は、例えば、Userモデルで処理され、自分のUserオブジェクトの値を変更するサーバーからデータが入ってきます。

Javaでモデルが変更されたことを発表者にどのように通知しますか?

私のモデルにプレゼンターへの参照を保持させ、ユーザーオブジェクトを変更した後に私のモデルにpresenter.userObjectHasBeenUpdated()のようなものを明示的に呼び出せますか?または、ユーザーオブジェクトが変更されたときに自動的にpresenter.userObjectHasBeenUpdated()を呼び出すリスナーをユーザーオブジェクトに配置する方法はありますか?

答えて

5

私は、Observerのような専用のインターフェースを作成し、プレゼンターにそれを実装させると言います。次に、各発表者は、オブジェクトが変更されたときに通知されるモデルオブジェクトに自分自身を登録することができます。

public interface Observer { 
    public void update(Object notification, Object source); 
} 

とモデル内:

もちろん
private List<Observer> observers = new ArrayList<Observer>(); 

public void addObserver(Observer observer) { 
    if (!observers.contains(observer)) { 
     observers.add(observer); 
    } 
} 

public void removeObserver(Observer observer) { 
    observers.remove(observer); 
} 

protected fireNotification(Object notification) { 
    for(Observer observer:observers) { 
     observer.update(notification, this); 
    } 
} 

あなたの通知などを入力して、スレッドの安全性を追加することによって、このすべてを向上させることができます...

+0

作品は素晴らしい仲間です。 –

0

あなたがするSwingコンポーネントを使用している場合ビューでデータを表示すると、それぞれのモデルを使用して通知できます。また、リスナーとして機能しますが、コンポーネントによっては通知のレベルがさらに細かくなります。たとえば、テーブル内の行または変更の変更をJTableに通知できます。例については、http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html#fireTableChanged(javax.swing.event.TableModelEventを参照してください。

関連する問題