这是将MVC用于多个视图的好方法吗?

时间:2014-12-19 16:59:41

标签: java swing design-patterns model-view-controller

我正在使用MVC来组织一个Maths Game应用程序,该应用程序具有以下多个类:

  • MathsGame.java:主要课程。目前持有CardLayout,其中包含哪些屏幕类并运行应用程序以及其他类似控制器的操作。
  • DiffScreen.java:实现组件并包含在难度选择屏幕上使用的方法。从MigJPanel扩展而来,基本上是模型/视图的混合。
  • GameScreen.java:实现组件并包含在游戏屏幕上使用的方法。从MigJPanel扩展而来,基本上是模型/视图的混合。
  • EndGameScreen.java:实现组件并包含在最终游戏屏幕上使用的方法。从MigJPanel扩展而来,基本上是模型/视图的混合。
  • MigJPanel.java:扩展JPanel并将布局设置为MigLayout并添加遮罩边框。
  • ScreenInterface.java:由DiffScreenGameScreenEndGameScreen实施,包含final个变量和enum

我已经看了一些教程并阅读了MVC,但我发现的很多资源都涉及非常基本的程序;拥有一个模型,一个视图,一个控制器和一个主类。

我知道如何重构我的程序以使用MVC,但我不确定几件事情。

  1. 我是否正确地说,从上面的课程中,我应该将DiffScreenGameScreenEndGameScreen分成每个模型和视图类?另外,最好是创建一个Controller类,或者 - 我已经看过建议 - 没有麻烦,而是将它与我​​的主MathsGame类结合起来?我建议在前一个问题here中使用的方法,我可以实现一个Controller接口似乎也很有用,但我不确定是否/如何使用我的新代码。

    < / LI>
  2. 对于这么小的项目来说,将Model,View和Controller类拆分为自己的子包并将MathsGame保留在主包中是否有用/需要?

    < / LI>

    进一步澄清:

    我基本上想知道这些类是否是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

    其他

    • 我查看了Model-View-Presenter。它看起来类似,更适合整个应用程序。看来这些问题对此也有效。如果这更适合我想做的事情,我也会对此感到满意。

    我希望我能够很好地解释自己。这是一个大学项目,但由于生病我去年错过了很多,所以我对这些方面有点困惑。如果我能更好地澄清任何部分,请发表评论。提前感谢任何建议!

2 个答案:

答案 0 :(得分:1)

  1. MathsGame.java =最底层
  2. 观点:DiffView.java,GameView.java,EndGameView.java
  3. 型号:DiffModel.java,GameModel.java,EndGameModel.java
  4. Controller:Controller.java(必须)
  5. MigJPanel.java = MathsGame.java之上的图层
  6. ScreenInterface.java =您的MigJPanel.java与MVC表示层之间的连接接口。
  7. 请记住实施单一责任模式,因为一个类仅用于一个目的。您不能将主代码与控制器代码混合在一起。令人困惑,不推荐。

    谢谢,

答案 1 :(得分:1)

我的答案是基于您的用户界面(GameViewEndGameView)包含Swing组件,例如JTextPaneJTextFieldJTable等。

您需要单独的模型吗?

Swing组件有自己的模型。例如,JTableTableModelJComboBox会有ComboBoxModel

所以我想说,拥有与UI同步的自己的模型并不是处理事情的最佳方式。例如,如果JList中有一个数字列表,JTextField中的GameView中的总和,GameViewModel的{​​{1}}和int sum {1}}会复制内容,因为List<Integer> numbersJList已经拥有自己的模型。

但是如果要将此数据保存到某个持久性存储(可能是数据库)并将数据提取回来显示在用户界面上,那么使用JTextField对象具有GameData和{{ 1}}对此有用。但是,将该对象与UI中发生的更改同步仍然不合适。只有在用户保存数据时才能填充此对象(单击保存按钮)。

您需要一个单独的控制器吗?

Swing已经有了通过int sumList<Integer> numbers*Listeners等方式在用户界面组件与其模型之间进行通信的方法。因此,我不认为除了Swing附带的Listener之外,您需要一个单独的类来在用户界面和UI之间进行通信。

您应该将模型/视图和控制器放在不同的包中吗?

没有。为什么?彼此通信的类应该在同一个包中。因此,如果您有ActionListenerItemListenerGameView,则它们应位于同一个包中。 GameModelGameControllerDiffView应位于同一个软件包中。您不应将DiffModelDiffController放在同一个软件包中,因为它们都是视图和其他包中的所有模型等...如果你这样做,你必须公开大多数方法,以便GameViewDiffView进行交流,而如果你有相同包中的那些,那么你可以给他们default访问权限。为什么这有用?因为您的类的用户(将来会进行更改的人)将知道在包外使用哪些方法以及哪些方法不适用。