【问题标题】:Java MVC: updating View that observes multiple ModelsJava MVC:更新观察多个模型的视图
【发布时间】:2011-10-29 16:26:39
【问题描述】:

在我的 MVC 应用程序中,我使用 Swing 显示一个图表。它由具有不同设置的多个面板控制。我有MainModel 来构建并提供ChartView 输出的DomainObject。由于有多个面板,我不想让MainModel 变得很大,它为每个面板创建了ChildModels,并拥有自己的视图。反过来,MainControllerChildControllers 附加到它们。 'ChartView' 注册自身以观察MainModel 的变化以更新输出。

第一个问题是,由于ChildModels 基本上是MainModel 的一部分,他们的更改必须触发ChartView 的更新(除了他们自己的观点)。为了解决这个问题,我不得不手动让MainModelChartView 注册它的孩子。所以,现在我有多个模型附加到ChartView。虽然我知道这可能是由糟糕的设计(创建子模型的模型等)引起的,但该解决方案工作正常。但我想听听拆分一个大模型的其他方法。我有一个想法让MainModel 监听ChildModels 的变化并通知ChartView。这样,只有一个模型与ChartView 通信。

第二个问题是ChartView 更新的链式触发。发生这种情况是因为所有这些带有设置的面板都有一些相互依赖的值。因此,如果用户在first panel 中输入某个值,则来自second panel 的值可以更改的范围。当控制器更新second panel 时,它会触发StateChange Event。由于ChartView 被订阅以收听ChildModels 的更新,它将收到来自两个面板的更新通知。现在,就我而言,我有 8 个。这使得用户的一次输入导致 8 个ChartView 重绘。这可能又是设计不佳的结果。但在这种情况下,我不知道如何正确处理这些多个更新通知并使GraphView 仅在最后一次请求时更新。我的解决方案是进行事务更新。模型发送beginUpdateendUpdate 通知而不是查看单个通知。只有在视图收到endUpdate 后,它才会查询模型以获取更新的数据。这种方式嵌套模型更新通知有点“静音”。

我想知道您是如何解决这些问题的。谢谢

【问题讨论】:

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


    【解决方案1】:

    据我了解您的担忧,错误是让ChartView 同时收听多个模型。 MVC 假设只有一个模型。所以ChartView 应该 连接到MainModelMainModel 的目标是正确地多路复用来自面板的更改,并将事件发送到 ChartView。您让MainModel 聆听子模型并为ChartView 服务的想法对我来说似乎是正确的设计。

    关于您的第二个问题,常见的用法是事件中的布尔参数(例如multiple)。值true 表示下一个事件是序列的一部分,false 表示序列结束。如果事件不是序列的一部分,请将参数设置为false(表示长度为 1 的序列)。在您的用例中,只需忽略带有true 的事件并等待false 事件查询稳定状态。

    【讨论】:

    • 您提到“MVC 假定只有一个模型”。比如一个JTable,可能有数据模型、列模型、选择模型等,你能详细说明一下吗?
    • 在这里,当您谈论数据/列/选择模型时,您实际上是在谈论 3 个不同的 MVC 实例,即使它们对同一个摆动组件有贡献。
    • 另外我说过View一次最多只能连接一个Model,因为MVC模式的作用是连接一个view和一个model,而不是多路复用来自不同来源的输入。这种功能应该在模型级别实现,以使视图不受这种任意复杂性的影响。
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 2023-03-05
    • 2020-02-19
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2011-01-07
    相关资源
    最近更新 更多