我正在尝试使用带有 Observer/Observable 的 MVC 设计范式开发“人员数据库”Java Swing 应用程序。这是我正在使用的 M/V/Cs 的简化摘要:
App
AppModel
(Empty right now, possibly i'll store certain static application info such as version number here)
AppView
(Creates a JFrame and a few other Swing components)
AppController
(Instantiates AppModel, AppView and also a PersonController and a PersonListController)
Person
PersonModel
(Stores info for 1 person)
PersonView
(Displays a number of form fields inside a JPanel (i.e Name, Age, Phone number). Observes PersonModel.)
PersonController
(Instantiates PersonView. Observes PersonView. Instantiates PersonModel. Updates PersonModel.)
PersonList
PersonListModel
(Stores a list of Persons)
PersonListView
(Displays a list of persons with appropriate Add / Delete buttons. Observes PersonList.)
PersonListController
(Instantiates PersonListView. Observes PersonListView. Instantiates PersonListModel. Updates PersonListModel)
此外,还有一个“引导程序”,即应用程序启动的地方。它创建了一个新的 AppController。
在实际应用程序中,会有更多(和不同的)模型/视图/控制器对象,但我想让这个示例保持简单。
我不明白如何将这些单独的视图“合并”到一个 UI 中,同时保持良好的关注点分离。
以 PersonListView 为例。恕我直言,它不需要关心 AppView(使用 JFrame 等)。PersonListView 只需要查看自己的模型并相应地更新自己。但是,我不能强制执行,因为 PersonListView 自己的 Swing 组件需要添加到另一个视图 AppView 的 Swing 组件中。
所以目前 AppController 正在实例化自己的 View,并间接地加上 PersonView 和 PersonListView(通过它们的控制器的实例化)。AppController 然后为每个视图抓取“主”Jpanel,抓取它们应该添加到 AppView 上的“父”Swing 组件,然后添加它们。
这对我来说似乎不是正确的方法。我将与 Swing 相关的成员从他们的藏身之处拉出来,并在控制器内与他们搞乱。事实上,在控制器中实例化模型和视图似乎也很糟糕,但我想不出更好的方法。
最近我已经看过足够多的“简单 MVC”教程,以至于我梦想着这些血腥的东西——但似乎没有一个教程涉及多个模型、视图、控制器的关系,尤其是涉及到 Swing 的地方。也许我错了,应用程序应该只有一个视图?也许我需要一个“关系”类来获取每个模型/视图/控制器并适当地实例化东西?
任何建议将不胜感激,因为我完全不知所措!