使用什么?MVC、MVP 或 MVVM 或...?

2022-09-01 05:11:56

我将启动一个Java项目来开发一个桌面应用程序。什么用作表示层模式(MVC,MVP,MVVM或...)?

...如果可能的话,用一些工作的小例子... :-)


答案 1

实际上,您正在寻找的最终帖子是这个答案这个答案来自Karsten Lentzsch(JGoodies的名声)在Swing Frameworks和Best Practices Swing Frameworks and Best Practices线程中。

你好

几年来,我一直在编写Swing应用程序,许多人都觉得这些应用程序很优雅。我教开发人员如何有效地使用 Swing:如何构建和组装应用程序,如何绑定和验证日期,以及如何在 Swing 中查找、设计、布局和实现精心设计的屏幕。

我想说的是,网上没有关于 Swing 的“最佳实践”。我怀疑是否有人能提供“最佳”实践,因为这需要 Swing 开发人员和解决方案提供商之间就方法、技术上效果良好、易于理解和处理的方法进行讨论。此外,最佳做法将解释谁可以达到什么结果质量,并且它们将描述生产时间和生产成本;但我永远无法在网上或Swing的书中找到这些信息。

在我看来,缺乏良好的实践和信息来构建Swing应用程序是开发人员在开始使用Swing时面临的最大障碍。与我合作的大多数开发人员在寻找设计、实现布局、构建面板、绑定数据、处理事件以及安排不同的代码部分和代码层方面都很慢。我见过的许多Swing应用程序都很糟糕。除了糟糕的视觉设计之外,它们很难理解,即使是很小的改变也会花费很多。通常,开发人员不知道在哪里放置什么代码?,如何分离关注点?如何将事物联系在一起?,如何使用操作?,如何启动应用程序?以及如何存储和还原UI状态?大多数开发人员缺乏可遵循的准则。

但我发现,普通的开发人员可以很好地使用Swing,如果只是用手 - 在大约3到10天内。几乎所有的问题都可以通过代码,库,应用程序体系结构,模式,一般编程实践,精心设计的示例,教程等来回答或解决。我教授一个Swing开发过程,该过程围绕3层架构构建,该架构将域,工具和表示层分开,并且基于高效的布局系统。尽管大多数部分是以编程方式完成的,但开发人员可以快速获得结果,并且代码和可视化设计都变得非常一致。这可以大大提高开发人员的工作效率 - 在某种程度上,Swing工作在项目工作中所占的比例要小得多。

那么,您能做些什么呢?我强烈建议研究Martin Fowler的草案,以进一步研究“企业应用程序架构的模式”。我发现这些模式非常适合 Swing 和 Swing 团队 , 即使对于刚接触 Swing 和 Swing 架构的开发人员也是如此。我首先选择以下模式:“表示模型”、“分离域”和“分离演示”。我个人更喜欢演示模型(Smalltalkers的应用程序模型),而不是模型 - 视图 - 表示器模式(MVP)。但是,MVP是一种真实且经过充分研究的替代方案。

Fowler 的模式可以与 3 客户端层体系结构结合使用,该体系结构可针对中等大小的 Swing 应用程序进行良好扩展。它由域层、表示层和中介模型层组成。我已经在数据绑定演示文稿中概述了此体系结构。基于 MVP 的应用也可以在这 3 个客户端层中构建。

Swing 应用程序的一个关键任务是数据绑定:如何将域对象和域对象属性连接到 Swing 组件。基本上,您可以来回复制数据,或者构建从域对象到 UI 组件的适配器链。复制方法易于理解,通常是那些不熟悉 Swing 或数据绑定的人的首选。我会说这是一个不错的选择。另一方面,复制使同步视图变得更加困难。适配器链和自动或半自动更新可以显著减少将域数据绑定到 UI 所需的代码量。缺点是,这种方法更难理解。正如您所指出的,Swing没有为可用于绑定文本字段的可重用且灵活的模型提供很好的抽象;文档界面不适用于通用数据访问。有一些可用的库提供了一个ValueModel接口,该接口旨在为单值数据添加通用,强大且灵活的模型:字符串,布尔值,数字,日期等。

我不知道有哪本 Swing 的书解释了真正的 Swing 应用程序开发过程。理想情况下,这样的书将结合上面提到的模式,架构和数据绑定技术,并描述如何在Swing中实现它。无论如何,有一个10年前的Smalltalk应用程序开发过程的文档可以做到这一点。Oracle的JClient架构和文档并不那么完整,但对于Java开发人员来说可能更容易阅读。我提供了一个关于数据绑定的演示,该演示是关于 Fowler 模式、3 层体系结构和这些模式的 Swing 实现以及自动数据绑定。我的绑定库的教程源代码可以帮助您熟悉适配器链和 ValueModel 接口。有关 MVP 模式的最佳文档可以在 Dolphin Smalltalk 文档中找到。

选择架构和桌面模式集后,您应该解决以下更基本的 Swing 任务:1) 通过选择一组适合您的目标平台集的专业外观来改善外观,2) 选择一个布局系统,帮助您快速构建设计良好且一致的屏幕,3) 选择数据验证解决方案, 4)为日常摇摆任务抓一袋解决方案。

有几个项目概述了Swing架构,解决了数据绑定和典型的Swing任务,例如:Sun的JDNC,Oracle的JClient/ADF,Spring RCP,NetBeans平台。我提供了一套基于开源 JGoodies 库的商用 Swing 解决方案,并为所有公共 JGoodies 工具和演示添加了一袋解决方案和源代码。这些来源旨在解释如何将上述所有问题联系在一起。

让我补充一下我关于所谓的“MVC”框架的标准警告。Swing不使用MVC,它使用修改后的模式。MVC经常被错误引用和误解 - 特别是在Swing的背景下。此外,MVC 适用于 UI 组件,不适用于应用程序。因此,我建议寻找反映 Swing 架构(而不是 MVC)的概念、解决方案和库。

MVC模式的发明者社区在1993年左右引入了AppplicationModel(现在称为Presention Model);MVP紧随其后。在我看来,这两种模式对Swing来说比MVC更有用。最近,将演示模型模式带给更多受众的环境转向了一种新的体系结构:“Pollock”。有兴趣的读者可以在谷歌上查看它与通常与演示模型结合使用的适配器链有何不同。

最后但并非最不重要的是个人陈述。与我以前使用过的其他工具包或框架相比,我可以更好地使用Swing。我可以用更少的代码做更多的事情,代码结构更好,更容易维护,而且我很快就能得到结果。

希望这有帮助。最好的问候, 卡斯滕·伦茨施

参考:Fowler 的进一步模式 - http://martinfowler.com/eaaDev 数据绑定演示 - http://www.jgoodies.com/articles/ Smalltalk 应用程序开发流程 - http://www.cincom.com/downloads/pdf/AppDevGuide.pdf MVP 模式文档 - http://www.object-arts.com/EducationCentre/Patterns/MVP.htm Sun 的 JDNC 项目主页 - http://jdnc.dev.java.net/ Oracle 的 ADF FAQ - http://www.oracle.com/technology/products/jdev/htdocs/905/adffaq_otn.html 春季RCP项目首页 - http://www.springframework.org/spring-rcp.html NetBeans平台首页 - http://www.netbeans.org/products/platform/ JGoodies秋千套房 - http://www.jgoodies.com/products/index.html

如果你不了解Karsten和JGoodies,那么相信我,这个家伙真的知道他在说什么。我强烈建议仔细阅读他的答案他作为参考发布的材料。更具体地说,请务必检查他的桌面模式和数据绑定演示文稿。令人惊讶的是,我更喜欢旧版本而不是新版本

让我引用他关于MVC与MVP的幻灯片:

  • 是的,Swing 在内部使用 MVC 的扩展形式
  • MVC 用于组件,MVP 用于应用程序

然后从摘要中:

  • 摆动使演示模型变得简单
  • PM 需要粘合解决方案

但是在解释这一点方面,我不能比卡斯滕做得更好,我充其量只能解释他。所以只要读他!

也可以看看桌面Java演示学习(更准确地说是Scott Violet的答案)。


答案 2

下面是一篇文章,它比较了Java中用于实现同一屏幕的三种GUI模式三次:

使用ZK Java AJAX框架实现事件驱动的GUI模式,Simon Massey,Sachin K Mahajan

由于不同的框架和语言对人们认为的MVP,MVC,MVVM和MVVMP等略有不同,因此本文小心翼翼地引用了Martin Fowler给出的长名称的模式,而不是易于争论M__绰号的简称。

显然,ZK是一个类似Web或移动桌面的编程环境,但这些模式同样适用于Swing或其他胖客户端框架。但是,如果没有针对某个桌面环境的良好数据绑定框架,则尝试MVVM不是很可行。因此,在这个早期的演示中,“表示模型”模式被赋予了模型 - 视图 - 绑定器的绰号“MVB”,作为将其称为“MVVM”的替代方法:

Design Patterns in ZK: Java MVVM as Model-View-Binder, Simon Massey


推荐