Java 这是一种将MVC用于多视图的好方法吗?

Java 这是一种将MVC用于多视图的好方法吗?,java,swing,design-patterns,model-view-controller,Java,Swing,Design Patterns,Model View Controller,我正在使用MVC组织一个数学游戏应用程序,该应用程序包含以下多个类: MathsGame.java:主类。当前持有CardLayout,其中包含屏幕类,并与其他类似控制器的操作一起运行应用程序 DiffScreen.java:实现组件并包含在难度选择屏幕上使用的方法。从MigJPanel扩展而来,本质上是模型/视图的混合 GameScreen.java:实现组件并包含在游戏屏幕上使用的方法。从MigJPanel扩展而来,本质上是模型/视图的混合 EndGameScreen.java:实现组件并

我正在使用MVC组织一个数学游戏应用程序,该应用程序包含以下多个类:

  • MathsGame.java
    :主类。当前持有CardLayout,其中包含屏幕类,并与其他类似控制器的操作一起运行应用程序
  • DiffScreen.java
    :实现组件并包含在难度选择屏幕上使用的方法。从MigJPanel扩展而来,本质上是模型/视图的混合
  • GameScreen.java
    :实现组件并包含在游戏屏幕上使用的方法。从MigJPanel扩展而来,本质上是模型/视图的混合
  • EndGameScreen.java
    :实现组件并包含在游戏结束屏幕上使用的方法。从MigJPanel扩展而来,本质上是模型/视图的混合
  • MigJPanel.java
    :扩展
    JPanel
    ,将布局设置为
    MigLayout
    ,并添加无光边框
  • ScreenInterface.java
    :由
    DiffScreen
    GameScreen
    EndGameScreen
    实现,包含
    final
    变量和
    enum
我看过一些教程并阅读了MVC,但我在MVC上找到的很多资源都涉及非常基本的程序;具有一个模型、一个视图、一个控制器和一个主类

我有一个想法,我必须着手重构我的程序以使用MVC,但我不确定有几件事

  • 我说的对吗?从我上面的类中,我应该将
    DiffScreen
    GameScreen
    EndGameScreen
    拆分为每个类的模型和视图类?另外,创建一个控制器类更好吗?或者正如我所看到的那样,不要麻烦,而是将它与我的主
    MathsGame
    类结合起来?在前面的一个问题中,有人建议我使用一种方法来实现一个控制器接口,这种方法似乎也很有用,但我不确定这是否适用于我的新代码

  • 对于这么小的项目,将模型、视图和控制器类拆分为各自的子包并将
    MathsGame
    保留在主包中是否有帮助/需要

  • 进一步澄清:

    我想知道拥有这些类是否是MVC的一个好实现:

    • MathsGame.java
      :作为一个主类,或者可能是我的控制器。也可能实现上面链接的答案中建议的控制器接口
    • 这3个可能在它们自己的子包中,比如说
      GamePackage.Views
      • DiffView.java
      • GameView.java
      • EndGameView.java
    • 这3个可能在它们自己的子包中,比如说
      GamePackage.Model
      • DiffModel.java
      • GameModel.java
      • EndGameModel.java
    • Controller.java
      :如果MathsGame是我的主类和控制器类,则不需要它。如果需要,可以在其自己的子包
      GamePackage.Controller
    • MigJPanel.java
    • ScreenInterface.java
    附加:

    • 我已经查看了模型视图演示器。它看起来很相似,更适合整个应用程序。这些问题似乎也适用于此。如果这更适合我想做的,我也会同意的
    我希望我已经解释得足够清楚了。这是一个大学项目,但我去年因为生病错过了很多,所以我对这些方面有点困惑。如果我能更好地澄清任何部分,请留下评论。提前感谢您的建议

  • MathsGame.java=最底层
  • 视图:DiffView.java、GameView.java、EndGameView.java
  • 模型:DiffModel.java、GameModel.java、EndGameModel.java
  • 控制器:Controller.java(必须)
  • MigJPanel.java=位于MathsGame.java之上的层
  • ScreenInterface.java=连接MigJPanel.java和MVC表示层的接口
  • 请记住实现单一责任模式,因为一个类只为一个目的服务。不能将主代码与控制器代码混合使用。容易混淆,不建议使用


    谢谢,

    我的回答基于这样的假设:您的用户界面(
    GameView
    EndGameView
    )包含Swing组件,如
    JTextPane
    JTextField
    JTable

    您需要单独的型号吗?

    Swing组件有自己的模型。例如,a有a,a将有自己的

    所以我想说,拥有自己的模型并与UI更改同步并不是处理事情的最佳方式。例如,如果您在
    JList
    中有一个数字列表,并且在
    GameView
    中有
    JTextField
    中的和,那么拥有一个
    GameViewModel
    中有
    int-sum
    JTextField
    游戏视图模型将重复这些内容,因为
    JList
    已经有了自己的模型

    但是,如果您要将这些数据保存到某个持久性存储(可能是数据库)中,并将数据取回以显示在用户界面上,那么拥有一个
    GameData
    对象,该对象具有
    int sum
    列表编号
    ,将非常有用。但是,将该对象与UI中发生的更改同步仍然是不合适的。仅当用户保存数据时(单击“保存”按钮),才应填充此对象

    您需要单独的控制器吗?