我正在使用MVC来组织一个Maths Game应用程序,该应用程序具有以下多个类:
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,但我不确定几件事情。
我是否正确地说,从上面的课程中,我应该将DiffScreen
,GameScreen
和EndGameScreen
分成每个模型和视图类?另外,最好是创建一个Controller类,或者 - 我已经看过建议 - 没有麻烦,而是将它与我的主MathsGame
类结合起来?我建议在前一个问题here中使用的方法,我可以实现一个Controller接口似乎也很有用,但我不确定是否/如何使用我的新代码。
对于这么小的项目来说,将Model,View和Controller类拆分为自己的子包并将MathsGame
保留在主包中是否有用/需要?
进一步澄清:
我基本上想知道这些类是否是MVC的一个很好的实现:
MathsGame.java
:作为主要类,或者可能是我的控制者。也可以按照上面链接的答案中的建议实现控制器接口。GamePackage.Views
DiffView.java
GameView.java
EndGameView.java
GamePackage.Model
DiffModel.java
GameModel.java
EndGameModel.java
Controller.java
:如果MathsGame是我的主类和控制器类,则不需要。如果需要,可以在自己的子包GamePackage.Controller
中。MigJPanel.java
ScreenInterface.java
其他
我希望我能够很好地解释自己。这是一个大学项目,但由于生病我去年错过了很多,所以我对这些方面有点困惑。如果我能更好地澄清任何部分,请发表评论。提前感谢任何建议!
答案 0 :(得分:1)
请记住实施单一责任模式,因为一个类仅用于一个目的。您不能将主代码与控制器代码混合在一起。令人困惑,不推荐。
谢谢,
答案 1 :(得分:1)
我的答案是基于您的用户界面(GameView
,EndGameView
)包含Swing组件,例如JTextPane
,JTextField
,JTable
等。
您需要单独的模型吗?
Swing组件有自己的模型。例如,JTable有TableModel而JComboBox会有ComboBoxModel。
所以我想说,拥有与UI同步的自己的模型并不是处理事情的最佳方式。例如,如果JList
中有一个数字列表,JTextField
中的GameView
中的总和,GameViewModel
的{{1}}和int sum
{1}}会复制内容,因为List<Integer> numbers
和JList
已经拥有自己的模型。
但是如果要将此数据保存到某个持久性存储(可能是数据库)并将数据提取回来显示在用户界面上,那么使用JTextField
对象具有GameData
和{{ 1}}对此有用。但是,将该对象与UI中发生的更改同步仍然不合适。只有在用户保存数据时才能填充此对象(单击保存按钮)。
您需要一个单独的控制器吗?
Swing已经有了通过int sum
(List<Integer> numbers
,*Listeners
等方式在用户界面组件与其模型之间进行通信的方法。因此,我不认为除了Swing附带的Listener之外,您需要一个单独的类来在用户界面和UI之间进行通信。
您应该将模型/视图和控制器放在不同的包中吗?
没有。为什么?彼此通信的类应该在同一个包中。因此,如果您有ActionListener
,ItemListener
和GameView
,则它们应位于同一个包中。 GameModel
,GameController
和DiffView
应位于同一个软件包中。您不应将DiffModel
和DiffController
放在同一个软件包中,因为它们都是视图和其他包中的所有模型等...如果你这样做,你必须公开大多数方法,以便GameView
和DiffView
进行交流,而如果你有相同包中的那些,那么你可以给他们default访问权限。为什么这有用?因为您的类的用户(将来会进行更改的人)将知道在包外使用哪些方法以及哪些方法不适用。