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

Tracking unsaved changes in Java Swing application

我的问题

什么是通知 "top-level" 模型的好方法(代表整个应用程序的模型,但不知道它所组成的每个 "child" 模型的详细信息of) 每当 "child" 模型发生任何微小变化时?

问题的背景

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

应用程序可以使用文件系统保存和加载此 "calculation"。我想知道如何跟踪应用程序的 "model" 是否有任何 未保存的 更改,以便我可以:

  1. 如果存在未保存的更改,则在关闭前提示保存
  2. 如果没有未保存的更改则直接关闭
  3. 打开新文件时提示保存(按设计,只能打开1个文件)

我按照 MVC 架构构建了这个应用程序。这意味着每当相应的模型 object 更改时,我的每个视图 (Swing) 元素都会收到通知(通过 Observer.update() ),因此视图元素会选择性地更新,而不必渲染所有视图对于不会影响一切的微小变化。

视图和模型是分层构建的,因此模型包含其他模型,视图包含其他视图。 "Parent" 视图通过分配给它们 "child" 模型来创建它们的 "child" 视图,这些模型是从它们自己的 "parent" 模型中获得的。

我认为 sub-optimal 解决方案以及原因

每个小模型都有主视图observe

我不知道要将主视图作为 listener/observer 添加到应用程序中的每个模型,因为确实有很多模型 object,并且主视图会因此得到一个非常高的 noise-to-signal 比率(模型执行的计算有很多步骤,每个步骤都会触发更新,我只需要知道某些东西发生了一次变化,而不是每次都发生变化)。

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

我不希望每个模型 object 都引用主模型,因为在我看来这违反了基本的软件设计原则。

每个模型都有一个 parent 参考。更改时,parent 会收到通知

如果一个child改变了,它告诉它的parent;这一直传播到 "main" 模型 object 收到通知,它可以更改其状态以反映有未保存的更改。保存时,它会将此标志设置回来。 似乎是一个 quasi-ideal 解决方案,除了我不喜欢每个 child 模型都需要对其 parent 模型的引用 - 组合的语义或 "has-a"-如果我这样做,关系似乎会倒退。

您至少有两个选择

你可以...

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

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

你可以...

让每个子模型在更改时触发一个事件,父模型(在顶部)可以用来跟踪更改。

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