2015-02-10 139 views
2

我的问题

会是什么好办法的通知“顶级”模式(即代表整个应用程序之一,但不知道的每一个细节“的孩子未保存的更改“它的模型是由什么组成的),每当任何”孩子“模型发生了什么小的变化?跟踪在Java Swing应用程序

语境问题

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

应用程序可以使用文件系统保存和加载此“计算”。我想知道如何跟踪如果应用程序的“模式”有什么未保存变化,使我可以:

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

我已经建立了这个应用之后的MVC架构。这意味着我的每个视图(Swing)元素在相应的模型对象发生变化时都会收到通知(通过Observer.update()),因此视图元素会有选择地更新,而不必渲染所有视图以进行微小的更改影响一切。

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

我认为什么次优解,为什么

具有主视图observe每一点模型

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

在每一个小模型有到主模型的引用通知它的变化

我不希望每一个模型对象具有对主模型的引用,因为这对我来说似乎是反对基本的软件设计原则。

每个模型都有父引用。如有更改,通知家长

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

+0

不完全了解你的代码是如何建立的,但是你认为每个小模型都是需要改变的状态的观察者,其中最初注册的观察者是从主要最顶级父模型开始逐步降低建设链的?另外,我正在阅读你的问题的方式是模型由其他模型(树下的小模型)组成,就像层次结构不知何故,层次结构也可能以图形方式在视觉上表示。 – NESPowerGlove 2015-02-10 21:50:04

+0

@NESPowerGlove你的层次部分*完全正确。模型组成的模型;由视图组成的视图。 – MHaaZ 2015-02-10 22:29:53

+0

@trashgod对不起,但由于我不知道API的心脏,它不是很明显*如何*或*为什么用*来使用您的建议。请你详细说明一下吗? – MHaaZ 2015-02-10 22:52:29

回答

1

您至少有两种选择

你可以...

有父模型检查每个子模型(每个子模型检查是儿童)和寻找任何(或第一)模型已经改变了

如果你只想知道某个给定时刻的状态(就像退出应用程序之前那样),这很好。这是比较便宜的,你可以控制何时进行手工检查和维护回调和处理事件通知

你可以不占用大量的额外资源...

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

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