Java MVC模式:哪个更好?是否允许视图或控制器创建和引用其他视图或控制器?

Java MVC模式:哪个更好?是否允许视图或控制器创建和引用其他视图或控制器?,java,model-view-controller,swing,design-patterns,decoupling,Java,Model View Controller,Swing,Design Patterns,Decoupling,我们正在开发一个相当大的Swing应用程序,它必须实现MVC模式。 应用程序当前看起来如下所示: 有相当多的观点。它们以分层方式创建,其中一个主视图包含(并创建) 多个视图都包含自己的子视图集等。每个视图都从模型中检索信息 独立于其他视图,在必要时调用模型静态方法 还有相当多的控制器,它们彼此完全分离。每个控制器 属于一个视图。每个视图都创建自己的控制器,并将控制器作为侦听器添加到用户输入中。 控制器从视图接收事件,然后通过模型静态方法修改模型。 当视图分派不影响模型但仅影响模型的事件时 视图

我们正在开发一个相当大的Swing应用程序,它必须实现MVC模式。 应用程序当前看起来如下所示:


有相当多的观点。它们以分层方式创建,其中一个主视图包含(并创建) 多个视图都包含自己的子视图集等。每个视图都从模型中检索信息 独立于其他视图,在必要时调用模型静态方法

还有相当多的控制器,它们彼此完全分离。每个控制器 属于一个视图。每个视图都创建自己的控制器,并将控制器作为侦听器添加到用户输入中。 控制器从视图接收事件,然后通过模型静态方法修改模型。 当视图分派不影响模型但仅影响模型的事件时 视图,视图自己处理这些事件,而不通知控制器这些事件。 也就是说,控制器完全不知道视图,控制器的目的只是处理模型的操作。 |编辑:控制器当前是其视图的附件;它们只包含用于事件处理的逻辑。也就是说,控制器本身不是组件,也不包含组件。它们的实现方式与以下示例相同:|

应用程序中的模型非常被动,甚至没有侦听器(它表示数据库)。 它从控制器接收更新


在本例中,视图拥有控制器。在一般情况下,如果控制器拥有并创建视图,并且让视图不知道控制器,而不是相反,会更好吗?那么,为什么呢? 这是如何设计的?如果没有,是否有更好的设计,控制器仍然不知道视图?或者,最好的设计是不是两者都不是

编辑:

如合同所述:

“视图负责建立这种相互通信…”一行 似乎表明视图创建了控制器,或者至少具有对控制器的初始引用,反之亦然

因此,这至少是一种可行的方法(这是一种有效的MVC模式),但主要问题仍然存在;哪一个更好,最好的设计是什么样的? 尤其是与许多与其职责密切相关的控制器打交道时 观点


编辑:另一个引用控制器的视图示例:

如图所示,控制器具有模型和视图。任何子视图都由相应的父视图管理。如前所述,子视图可以将事件转发给父视图。有一个包含更多链接的简单示例。

好的,因此我假设设计如下:所有控制器都是在某个主类中创建的。所有控制器都作为侦听器添加到主视图中。子视图将调用parent.stateChanged(e);转发事件。主视图将触发事件更改并使用EventListenerList(主视图是否应该实现一些接口?)。控制器会忽略接收到的与他们无关的事件(重要:他们如何知道应该忽略什么?)。是这个吗?感谢您,控制器经常侦听视图,而视图始终侦听模型。这显示多个视图侦听一个模型。如前所述,实际观察者机制是一个实现细节;这里提到了几种方法。您可能需要定义自己的
ApplicationEvent
类似于
awteEvent
@trashgood不,控制器经常侦听视图,视图总是侦听模型。。对不起,我看不出这和我在之前的评论中所建议的有什么区别?你的意思是(与我写的相反)应该只有一个控制器吗?啊,我误解了;关于控制器侦听视图,您是对的。我从来都不需要一个以上的应用程序控制器;影响应用程序模型的可能只是一组组件,每个组件都有自己的模型和视图。如果您需要多个控制器,您可以查看“从组件中分离功能和状态”。@Trashgod在这个应用程序中,就像现在一样,控制器不是面板,也不是扩展或使用任何swing组件。控制器仅包含用于操纵模型的逻辑。他们从各自的角度接收事件,并相应地采取行动。这是因为GUI没有明确区分哪些部分是控件,哪些部分不是。因此,控制器仅充当GUI中影响模型的操作的事件处理程序。如果我们将所有控件放在一个控制器中,这个控制器将变得巨大。