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

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

我的问题

什么是通知“顶级”模型(代表整个应用程序的模型,但不知道它所组成的每个“子”模型的详细信息)的好方法?任何“ child ”模型发生了什么事?

问题的背景

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

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

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

我在 MVC 之后构建了这个应用程序建筑学。这意味着每当相应的模型对象发生变化时,我的每个 View (Swing) 元素都会收到通知(通过 Observer.update() ),因此 View 元素会选择性地更新,而不必渲染所有元素一个不会影响一切的微小变化的 View 。

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

我认为什么是次优解决方案及其原因

让主视图观察每一个小模型

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

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

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

每个模型都有一个父引用。发生变化时,家长会收到通知

如果一个 child 改变了,它会告诉它的 parent ;这一直传播到“主”模型对象收到通知,它可以更改其状态以反射(reflect)有未保存的更改。保存时,它会将此标志设置回来。 似乎是一个准理想的解决方案,除了我不喜欢每个子模型都需要对其父模型的引用这一事实——如果我这样做,组合的语义或“有一个”关系似乎是倒退的.

最佳答案

你至少有两个选择

你可以...

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

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

你可以...

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

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

关于java - 跟踪 Java Swing 应用程序中未保存的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28442151/

相关文章:

java - 数组和随机值

java - 在 Java 中实现接口(interface)时降低可见性

Java修改ArrayList上的Class元素

java - NetBeans GUI 设计器窗口在设计和源代码之间切换不显示

java - 如何将这个程序分成几个类

c# - 在 Linq 一栏中加入 Records?

python - 导入模型/库类并从 Controller 调用

java - 在文本区域中搜索单词

java - 为什么客户端B没有得到完整的文件

c# - MVC Razor 隐藏输入和传递值