通知演示者模型已更改

时间:2012-04-02 17:47:02

标签: java observable mvp

我正在使用MVP设计模式,我已将我的演示者注册为我视图中各种按钮和其他交互元素的监听器。这样可以正常工作,只要用户在GUI中执行某些操作,我就会收到通知。

但是,当模型发生变化时,我没有通知演示者的程序。我从一个服务器进入数据,该服务器在例如User模型中处理,并更改我的User对象的值。

如何通知演示者模型在Java中已更改?

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

2 个答案:

答案 0 :(得分: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);
    }
}

当然,您可以通过添加Thread-safety,输入通知等来改善这一切......

答案 1 :(得分:0)

如果您使用Swing组件在视图中显示数据,则可以使用各自的模型进行通知。它们也可以作为监听器,但具有更好的通知级别,具体取决于组件。例如,可以通知JTable连续更改或更改整个表。有关示例,请参阅http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html#fireTableChanged(javax.swing.event.TableModelEvent)。