Java MVC:更新观察多个模型的View

时间:2011-10-29 16:26:39

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

在我的MVC应用程序中,我使用Swing显示图表。它由具有不同设置的多个面板控制。我有MainModel来构建DomainObject ChartViewMainModel输出。由于有多个面板而且我不想让ChildModels变大,因此会为每个面板创建MainController并拥有自己的视图。反过来,ChildControllers会将MainModel附加到他们身上。 'ChartView'注册自己以观察ChildModels中的更改以更新输出。

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

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

我想知道你是如何处理这些问题的。感谢

1 个答案:

答案 0 :(得分:0)

根据我对您的疑虑的理解,错误是让ChartView同时听取几个模型。 MVC假设只有一个模型。因此ChartView应将连接到MainModelMainModel的目标是正确地复用来自面板的更改,并将事件分派给ChartView。您想让MainModel听取子模型并提供ChartView的想法对我来说就像是正确的设计。

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