【发布时间】:2011-10-29 16:26:39
【问题描述】:
在我的 MVC 应用程序中,我使用 Swing 显示一个图表。它由具有不同设置的多个面板控制。我有MainModel 来构建并提供ChartView 输出的DomainObject。由于有多个面板,我不想让MainModel 变得很大,它为每个面板创建了ChildModels,并拥有自己的视图。反过来,MainController 将 ChildControllers 附加到它们。 'ChartView' 注册自身以观察MainModel 的变化以更新输出。
第一个问题是,由于ChildModels 基本上是MainModel 的一部分,他们的更改必须触发ChartView 的更新(除了他们自己的观点)。为了解决这个问题,我不得不手动让MainModel 用ChartView 注册它的孩子。所以,现在我有多个模型附加到ChartView。虽然我知道这可能是由糟糕的设计(创建子模型的模型等)引起的,但该解决方案工作正常。但我想听听拆分一个大模型的其他方法。我有一个想法让MainModel 监听ChildModels 的变化并通知ChartView。这样,只有一个模型与ChartView 通信。
第二个问题是ChartView 更新的链式触发。发生这种情况是因为所有这些带有设置的面板都有一些相互依赖的值。因此,如果用户在first panel 中输入某个值,则来自second panel 的值可以更改的范围。当控制器更新second panel 时,它会触发StateChange Event。由于ChartView 被订阅以收听ChildModels 的更新,它将收到来自两个面板的更新通知。现在,就我而言,我有 8 个。这使得用户的一次输入导致 8 个ChartView 重绘。这可能又是设计不佳的结果。但在这种情况下,我不知道如何正确处理这些多个更新通知并使GraphView 仅在最后一次请求时更新。我的解决方案是进行事务更新。模型发送beginUpdate 和endUpdate 通知而不是查看单个通知。只有在视图收到endUpdate 后,它才会查询模型以获取更新的数据。这种方式嵌套模型更新通知有点“静音”。
我想知道您是如何解决这些问题的。谢谢
【问题讨论】:
标签: java model-view-controller swing design-patterns