使用 OO 观察者模式而不更新源自更改的对象



我正在构建一个包含GUI和模型的应用程序。我正在使用观察者模式(使用 java 的内置接口)在模型中的字段发生更改时更新 GUI。

这通常工作正常,但我遇到一种情况,模型中的特定字符串变量(特别是文件的 url)可以通过两个单独的 JTextFields (swing) 进行更改,其内容实际上反映了有问题的模型变量的值。

我遇到的问题来自这样一个事实,即其中一个 JTextFields 的更改需要导致模型状态的更新,以及另一个 JTextField 的内容。我的模型确保仅在模型状态发生更改时向观察者发送通知。但是,修改 JTextFields 的过程涉及清空其文本内容,然后重置它。

无需赘述太多细节,其结果是更新/通知过程陷入无限循环。我暂时通过搁置这个特定问题的观察者模式来解决这个问题,但我想知道是否有人可以提出一种巧妙的方法,以确保特定组件不会因源自同一组件的更改而"更新"。

任何帮助表示赞赏。

如使用

MVC 的 Java SE Application Design 中所述,这是应用程序设计的几个问题之一。建议的方法依赖于一个PropertyChangeListener,如图所示。该PropertyChangeEvent包括旧值和新值以供参考。

这个讨论双向观察器的链接可能会在这方面提供一些帮助。

在您的情况下,模型和视图似乎正在尝试相互更新。解决方案在于强制执行更新的方向。例如,内层 -> 模型 -> 视图视图 -> 模型 -> 内层。 所以它不会真正是一个真正的观察者模式。

update(Observable o, Object arg) java.util.Observer方法接受Observable(主题)对象。此对象可用于向模型提供提示,要求它向内传播更新,而不是向视图传播。

我快速尝试了一下,发现设置双向观察器(使用 Java API)并不像我想象的那么简单。但你可以冒险尝试一下。

最新更新