跟踪Java Swing应用程序中未保存的更改

时间:2015-02-10 21:28:37

标签: java swing model-view-controller software-design

我的问题

通知“顶级”模型(代表整个应用程序的模型,但不知道每个“子”模型的细节,它是由什么组成的好方法)每当有任何小变化时发生过任何“儿童”模特?

问题的上下文

我正在构建一个中型Java Swing应用程序。粗略地说,它“模拟”计算,允许调整输入和参数。它实时更新计算的结果和中间步骤。这允许人们分析输入变化如何反映整体。

应用程序可以使用文件系统保存并加载此“计算”。我想知道如何跟踪应用程序的“模型”是否有任何未保存的更改,以便我可以:

  1. 如果存在未保存的更改,则在关闭前提示保存
  2. 如果没有未保存的更改,则直接关闭
  3. 打开新文件时提示保存(按设计,只能打开1个文件)
  4. 我已经按照MVC架构构建了这个应用程序。这意味着我的每个视图(Swing)元素都会在相应的模型对象发生更改时收到通知(通过Observer.update()),因此视图元素会有选择地更新,而不必渲染所有视图以进行微小更改这不会影响一切。

    视图和模型是分层构建的,因此模型包含其他模型,视图包含其他视图。 “父”视图通过为他们分配从他们自己的“父”模型获得的“子”模型来创建他们的“子”视图。

    我认为次优解决方案以及为什么

    主视图observe每个小模型

    我不知道将主视图作为监听器/观察者添加到应用程序中的每个模型,因为实际上有很多模型对象,因此主视图会产生令人难以置信的高噪声 - 信号比(模型执行的计算有很多步骤,每个步骤都会触发更新,我只需要知道某些事情已经改变了一次,而不是每次都改变。)

    在每个小模型中引用主模型以通知更改

    我不希望每个模型对象都有一个对主模型的引用,因为在我看来这些对象基本的软件设计原则。

    每个模型都有父参考。在更改时,将通知父级

    如果孩子改变了,它会告诉其父母;传播直到“主”模型对象得到通知,这可以改变其状态以反映未保存的更改。保存时,它会将此标志设置回来。 似乎是一个准理想的解决方案,除了我不喜欢这样一个事实,即每个子模型都需要对其父模型的引用 - 组合的语义或“has-a” - 关系似乎是向后弯曲,如果我这样做

1 个答案:

答案 0 :(得分:1)

您至少有两个选择

你可以......

让父模型检查每个子模型(并且每个子模型检查它的子项)并查找已更改的任何(或第一个)模型

如果您只想在某个特定时刻(比如退出应用程序之前)知道状态,这是很好的。它相对便宜,因为您可以控制何时手动执行检查,并且在维护回调和处理事件通知时不会消耗大量额外资源

你可以......

让每个子模型在事件发生变化时触发事件,父模型(位于顶部)可用于跟踪变化。

如果你想保持对模型的实时观察,让每个子模型触发一个事件是好的,但它是一些昂贵的,因为每个模型可能被多个观察者观察到,所以通知每个模型可能是昂贵的。您还需要链接事件,因此底部的子模型会通知它的父级,它将通知它的父级,依此类推第四级,直到它到达顶级父模型。