Java MVC模式中从控制器中分离视图

Ala*_*lan 5 java model-view-controller

第一次在StackOverflow上发布一个问题,所以请放轻松我:)

根据我的理解,正确使用模型 - 视图 - 控制器模式需要我们将视图和控制器分离,以使视图对控制器一无所知.我在使用Java Swing了解如何执行此操作时遇到了一些问题.

假设我有一个视图(一些扩展JFrame的类),这个视图有一个按钮.是否可以说我想将控制器注册为按钮的ActionListener?或者让它成为整个视图本身的倾听者.

如何在不执行以下操作的情况下执行此操作:

button.addActionListener(myController的)

在视图中,因为如果我在视图代码中这样做,它现在不会对控制器有依赖吗?

我没有发布任何代码,因为坦率地说我现在没有太多东西可以继续.

任何帮助都是有用的!

Nic*_*ick 4

不要将视图视为按钮等,而将其视为界面,这可能会有所帮助。该界面使得可以编写 Web UI、命令行控制台等并履行视图的角色。

对于按钮事件,按钮代表对控制器执行的某些命令的调用。

所以,你可以有这样的界面:

public interface MyViewIf {
    // used by the controller to register its self as a listener of the view
    public addViewListener(ViewListener vl);
    ...
}
Run Code Online (Sandbox Code Playgroud)

和:

public interface ViewListenerIf {
    // used by the View to notify any listeners of control events etc.
    public onViewEvent(ViewEvent ve);
}
Run Code Online (Sandbox Code Playgroud)

然后您的控制器将实现 ViewListenerIf 并将其自身注册到工厂生成的 MyViewIf 实例。这样控制器就不需要知道有关视图类的任何细节。

然后,您的视图类将在内部处理它自己的按钮事件,将它们转换为 ViewEvent 对象,并在向视图注册其自身的控制器上调用 onViewEvent() ,使视图 100% 不知道控制器的存在。