2

我正在使用 MVP 设计模式,并且我已将我的演示者注册为我视图中各种按钮和其他交互元素的侦听器。这很好用,每当用户在 GUI 中执行某些操作时,我都会收到通知。

但是,我没有在模型更改时通知演示者的程序。我有来自服务器的数据,这些数据在例如 User 模型中进行处理,并更改了我的 User 对象的值。

你如何通知演示者模型在 Java 中发生了变化?

presenter.userObjectHasBeenUpdated()在我更改用户对象后,我是否让我的模型持有对演示者的引用并在我的模型中显式调用类似的东西?或者有没有办法在用户对象上放置一个监听器,presenter.userObjectHasBeenUpdated()当用户对象被修改时会自动调用?

4

2 回答 2

6

我会说你创建了一个像 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);
    }
}

当然,您可以通过添加线程安全、输入通知等来改善这一切……

于 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 回答