2

MVPデザインパターンを使用しており、ビューのさまざまなボタンやその他のインタラクティブ要素のリスナーとしてプレゼンターを登録しています。そしてそれはうまく機能し、ユーザーがGUIで何らかのアクションを実行するたびに通知を受け取ります。

ただし、モデルが変更されたときにプレゼンターに通知する手順はありません。たとえば、Userモデルで処理され、Userオブジェクトの値を変更するサーバーからデータを受信して​​います。

Javaでモデルが変更されたことをプレゼンターにどのように通知しますか?

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

4

2 に答える 2

6

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

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);
    }
}

もちろん、スレッドセーフを追加したり、通知を入力したりすることで、これらすべてを改善できます...

于 2012-04-02T17:57:21.213 に答える
0

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

于 2012-04-02T18:05:25.490 に答える