【问题标题】:Using java.util.Observable with MVC java将 java.util.Observable 与 MVC java 一起使用
【发布时间】:2014-02-25 06:01:03
【问题描述】:

在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();

视图会检查这些值。如果您有其他方法,欢迎使用。

【问题讨论】:

  • 我会将 Observer/Observable 视为旧的、设计不佳的类,并改用 PropertyChangeListener。
  • @JBNizet:当您的评论弹出时,我只是将其输入到我的答案中!我确实喜欢 PropertyChangeEvent 对象的设置方式。
  • @HovercraftFullOfEels:我已经支持你的回答了 :)
  • @JBNizet:谢谢!如果您需要在 EDT 上工作的 Swing 实现,那么拥有 SwingPropertyChangeSupport 也很好。
  • 视图必须反映模型的状态——视图如何知道何时或改变什么?通过直接或间接通过控件观察模型。

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


【解决方案1】:

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

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

编辑
您提到这是一个可能的解决方案:

notifyObservers(this);

但我会避免这种情况,因为您的观察者已经收到此信息。

【讨论】:

  • 是的,我忘记了视图已经收到了模型......对此感到抱歉>。
猜你喜欢
  • 2011-02-25
  • 2012-06-02
  • 2010-10-04
  • 2017-08-27
  • 2010-09-09
  • 2011-06-26
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多