【问题标题】:Combining MVC, DAO/Repository Pattern and Swing for Java GUI Applications为 Java GUI 应用程序结合 MVC、DAO/存储库模式和 Swing
【发布时间】:2015-07-14 22:50:13
【问题描述】:

我正在尝试从头开始创建图形抽认卡应用程序。我有几个问题:

一个。过去我使用 Swing 构建了一些应用程序,计算器应用程序。但我觉得这是一个微不足道的应用程序,所以我想提高我作为 Java 开发人员的技能。

b.有人告诉我,一个黄金标准是构建一个使用其中之一的小型应用程序:MVC、MVM、MVVM 等等。由于我正在学习设计模式,我希望在应用程序中使用它。

c。我的课是这样的:

  • 一个模型:Flashcard.java(它有一个答案列表,一个列表 图片,一个问题),一个抽认卡管理器(执行 CRUD)
  • 不同的视图类:GUI 界面
  • 控制器:所有事件监听器
  • 应用:初始化应用

d。我试图阅读这种组合的在线示例,并且为 Manager 或 DAO 提出的建议是让它连接到数据库的 JDBC。我试图通过使用 HashMap> 来模拟这一点。这是正确的还是我必须使用 JDBC 或 SQLite?

e。我还应该有一个控制器-视图对,即每个使用事件侦听器或窗口控制器的 JComponent(启动窗口、主应用程序窗口、子窗口)?

f。控制器类也应该是所有这些控制器的接口吗?

我没有代码,因为我仍在开发它,但我只是想大致了解一下。感谢您回答我的问题。

【问题讨论】:

  • (d) 听起来很合理,您要做的是隐藏底层实现,因此如果您以后决定使用 JDBC 连接,则无需更改所有依赖的代码它
  • 你想多了(e),并不是每个JComponent 都需要拥有自己的控制器。事实上,你会发现这完全是一件痛苦的事,因为JComponents 有自己的控制器。相反,每个逻辑“视图”(可能是多个组件的容器)都需要一个控制器。在视图和控制器之间,有一个契约,描述了两者可以执行的动作和功能。当我做这种事情时,我会努力不将任何 UI 组件直接暴露给任何外部源
  • 这意味着我倾向于将监听器附加到视图中的组件,然后使用视图/控制器契约通过这些监听器进行通信。这意味着如果我想改变视图的工作方式,我不需要重新创建合约,只需确保我可以支持它
  • (f) 是的。模型和视图也应该如此。这样,您始终按照合同而不是执行来工作
  • 控制器是模型和视图之间的协调者,它监视这两者产生的事件并协调所需的更新。尽量不要将控制器用作两者的微管理器。模型和视图都应该有自己的内部工作,然后支持它们与控制器之间的合同。详细例子看here

标签: java swing user-interface model-view-controller repository-pattern


【解决方案1】:

b.有人告诉我,一个黄金标准是构建一个使用其中之一的小型应用程序:MVC、MVM、MVVM 等等。由于我正在学习设计模式,我希望在应用程序中使用它。

这对与错。一些 API 根本不支持纯 MVC(或变体)的概念。例如 Swing 实现了它自己的 MVC 形式,它更像 M-VC,其中模型是独立的,但视图和控制器是绑定的。

想想JButton。你有没有给它应用过控制器?你可以给它添加监听器,你甚至可以直接给它的模型添加监听器,但是它有它自己的内部控制机制,它根据键盘和鼠标的交互来生成事件。

您需要提防 MVC 何时可能不适合,或者实现纯 MVC 的工作量不值得付出努力。

话虽如此,您可以将 Swing UI 包装在另一个 MVC 层中,但您需要在不同的层次上考虑它。不是将每个控制器视为“视图”,而是查看可能包含多个控件的容器,并将其视为“视图”,然后由控制器管理。

d。我试图阅读这种组合的在线示例,并且为 Manager 或 DAO 提出的建议是让它连接到数据库的 JDBC。我试图通过使用 HashMap> 来模拟这一点。这是正确的还是我必须使用 JDBC 或 SQLite?

这不是一个不合理的想法,但是,您要确保公共接口保持不变。这将允许您在以后更改实现以使用 JDBC 或 Web 服务,而无需重写依赖于它的代码

e。我还应该有一个控制器-视图对,即每个使用事件侦听器或窗口控制器的 JComponent(启动窗口、主应用程序窗口、子窗口)?

这将取决于。我倾向于避免暴露单个组件,因为这会使它们暴露于不必要的修改(例如,您可能不希望控制器能够更改按钮的文本)

作为一般的经验法则,我尝试使控制器和视图之间的关系尽可能简单,这意味着控制器不应该关心视图是如何实现的,只需要维护视图之间的约定。它订阅了。

这通常意味着我有一个功能视图,它被收缩以产生某些事件/数据并允许某些交互(来自控制器)

f。控制器类也应该是所有这些控制器的接口吗?

恕我直言,是的。这允许以不同的方式实现视图/控制器/模型,但允许其余代码继续使用它而无需修改。

底线是,在 Swing 上实现 MVC 并不像人们想象的那么简单。这需要一些计划和考虑,但这是可行的。

如需更详细的示例,请查看Java and GUI - Where do ActionListeners belong according to MVC pattern?

【讨论】:

  • 谢谢。我不想听起来很不稳定或没有动力,但在未来,我应该使用 JavaFx 来实现这样的应用程序或第三方库还是完全放弃语言?
  • @corax 这取决于你。我没有使用过JavaFX,所以我可以说。虽然 MVC 并不老,但(不惜一切代价)推动它的使用却是。是不是重要?是和不是。您需要意识到,很多 API 在编写时都没有考虑到它(直接或间接地),所以有时候,您可能会发现以最纯粹的方式实现它是一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2012-08-26
  • 2014-11-22
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多