将java.util.Observable与MVC java一起使用

时间:2014-02-01 13:40:44

标签: java model-view-controller observer-pattern

在java中,您可以让模型扩展Observable类,并且视图实现Observer接口,以便使用观察者模式实现MVC,例如:

public AppView implements Observer{
    public void update(Observable arg0, Object arg1) {
        System.out.println((int)arg1);
    }
}

public AppModel extends Observable{
    public void doStuff(){
        x = x +1;
        setChanged();
        notifyObservers(x);
    }
}

现在,当模型只需要将一个变量更新到视图时,上面的示例没有问题。当我需要通知多于1个变量的变化视图时,事情通常变得丑陋或复杂。有没有一个干净的方法来解决这个问题?一个例子是我需要通知整数值和字符串的变化。

修改

我知道有一些解决方案可以解决这个问题。我只想就你最好的方法发表意见。

答案是:

notifyObservers("x");

这会告诉视图更新x。 另一个是模型自我传递

notifyObservers();

视图会检查值。如果您有其他方法,欢迎他们。

1 个答案:

答案 0 :(得分:2)

当听到多个变量时,我不确定“变丑”的含义是什么意思。我不是MVC的专家,但请考虑一下,

  • notifyObservers(...)方法放在所有绑定属性的setter方法中(所有要使其可听的变量。
  • 仅通过setter方法更改绑定属性。
  • 您甚至不必在notifyObservers方法中传递bound属性。如果你愿意,你可以传递一个null,在那里你通知观察者状态发生了变化,然后观察者可以调用他们感兴趣的getter方法来评估观察对象的状态。
  • 考虑使用PropertyChangeSupport和PropertyChangeListeners,而是为每个绑定属性赋予自己的String常量,并传递给notification参数,此String,旧值和新值。这就是我通常最终做的事情。

修改
你提到这是一个可能的解决方案:

notifyObservers(this);

但是我会避免这种情况,因为你的观察者已经收到了这些信息。