在我的MVC应用程序中,我使用Swing显示图表。它由具有不同设置的多个面板控制。我有MainModel
来构建和提供DomainObject
输出的ChartView
。由于有多个面板,并且我不想使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
之后,它才会向模型查询更新的数据。这样,嵌套模型更新通知就有点“静音”。
我想知道您如何解决这些问题。谢谢
最佳答案
据我对您的关注了解,错误是让ChartView
同时收听多个模型。 MVC假定只有一种模型。因此,ChartView
应该仅连接到MainModel
。 MainModel
的目标是正确多路复用来自面板的更改,并将事件分发到ChartView
。您想让MainModel
听子模型并提供ChartView
的想法对我来说似乎是正确的设计。
关于您的第二个问题,常见用法是事件中的布尔参数(例如multiple
)。值true
表示下一个事件是序列的一部分,而false
表示序列已结束。如果事件不是序列的一部分,则将参数设置为false
(表示长度为1的序列)。在您的用例中,只需忽略true
事件并等待false
事件查询稳定状态。