在Java Swing中实现MVC的Controller部分

use*_*927 2 java model-view-controller swing

这个问题围绕着在Java中实现MVC架构的标准实践 - 特别是Swing.我知道之前已经提出过这个问题,但我希望对控制器的使用有所了解.

我一直在分离我的模型,视图和控制器,其中:

  • 数据在模型类中处理
  • Swing组件在视图类中
  • 事件处理匿名类也在视图类中(用户输入)
  • 控制器类包含对模型和视图对象的引用

回到控制器的具体情况 - 我一直在使用类(静态)变量来表示控制器,以便我的应用程序的任何部分都能轻松访问.所以我的控制器类可能如下所示:

public class Controller {
    public static ControllerA controllerA;
    public static ControllerB controllerB;
}

public class ControllerA {
    private JPanel panel1;
    private JPanel panel2;
    private DefaultListModel list;
}

...
Run Code Online (Sandbox Code Playgroud)

每当我需要做某事时,我会像这样调用控制器:

Controller.controllerA.doSomething
Run Code Online (Sandbox Code Playgroud)

这意味着我的大部分代码都位于控制器中.通常,如果我需要做某事,控制器会有一个方法,它通常需要视图或模型中的等效方法来完成任务.我发现这会导致代码重复.例如:

Controller.controllerA.removeElement();
Run Code Online (Sandbox Code Playgroud)

将在控制器中调用以下方法:

protected void removeElement() {
    list.removeElement()
}
Run Code Online (Sandbox Code Playgroud)

随着我的应用程序的增长,我看到很多实例,控制器只是镜像模型或视图所需的操作,因为它是视图/模型的主要访问点.

所以我的问题是:

  • 使用静态变量访问控制器对象是一个好习惯吗?
  • 控制器 - >模型和控制器 - >之间的代码重复是否会影响MVC的副作用?
  • 我做错了吗?如果是这样,您将如何在MVC中实现控制器?

Mad*_*mer 6

使用静态变量访问控制器对象是一个好习惯吗?

不需要.您需要意识到您可以为同一视图(不同的实例)设置多个控制器,因此很快就会变成意大利面,并且很难控制和维护

控制器 - >模型和控制器 - >之间的代码重复是否会影响MVC的副作用?

不,我会说这是糟糕的设计.您应该有一个视图可以由满足两者之间的合同要求的任何控制器控制(视图知道如何与控制器通信,反之亦然),与模型相同.控制器可能会将许多不同的模型连接到视图......

我做错了吗?

恕我直言,是的

如果是这样,您将如何在MVC中实现控制器?

这是一个非常广泛的问题.

首先关注界面级别,设计界面描述每个部分的期望,模型,该模型的控制器,视图和该视图的控制器.控制器很可能需要实现至少两个接口才能满足模型和视图的要求,但这意味着它不关心任何一个的实现.

模型和视图也是如此,他们不应该关心控制器的实现,只要它满足合同要求.

值得深思

Swing没有实现纯MVC,因此在Swing周围尝试实现一个问题有很多问题.Swing控件是VC,模型是分开的.这种方法有利有弊.

话虽如此,您当前开始设置MVC的方法是一个很好的方法,视图中的UI相关元素,模型中的数据元素和控制器来协调它们......

举个例子,你可以看一下Java和GUI - ActionListeners在哪里根据MVC模式?