在我的MVC应用程序中,我使用Swing显示图表。它由具有不同设置的多个面板控制。我有MainModel来构建和提供DomainObject输出的ChartView。由于有多个面板,并且我不想使MainModel很大,因此会为每个面板创建具有自己视图的ChildModels。反过来,MainControllerChildControllers附加到它们。 '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仅在上次请求时更新。我的解决方案是进行事务更新。模型发送beginUpdateendUpdate通知,而不是查看单个通知。只有在视图收到endUpdate之后,它才会向模型查询更新的数据。这样,嵌套模型更新通知就有点“静音”。

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

最佳答案

据我对您的关注了解,错误是让ChartView同时收听多个模型。 MVC假定只有一种模型。因此,ChartView应该仅连接到MainModelMainModel的目标是正确多路复用来自面板的更改,并将事件分发到ChartView。您想让MainModel听子模型并提供ChartView的想法对我来说似乎是正确的设计。

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

08-06 20:52