用什么? MVC、MVP 或 MVVM 还是……?

2024-05-27

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

...如果可能的话,举一些可行的小例子...:-)


Actually, the ultimate post you're looking for is this answer http://forums.java.net/node/651182#comment-623436 this answer http://web.archive.org/web/20130618003937/https://www.java.net//node/651182#comment-623436 from Karsten Lentzsch (of JGoodies fame) in the Swing Frameworks and Best Practices http://forums.java.net/node/651182 Swing Frameworks and Best Practices http://web.archive.org/web/20130618003937/https://www.java.net//node/651182 thread.

Hello,

我已经编写 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 或数据绑定不熟悉的人;我想说这是一个不错的选择。 另一方面,复制使同步视图变得更加困难。 适配器链和自动或半自动更新可以 显着减少绑定域数据所需的代码量 到用户界面。缺点是,这种方法更难实现 理解。正如您所指出的,Swing 没有提供很好的抽象 用于绑定文本的可重用且灵活的模型 领域;文档接口不适合通用数据 使用权。有一些库可以提供 ValueModel 接口只是为了添加一个通用的、强大的、 单值数据的灵活模型:字符串、布尔值、数字、 日期等

我不知道有一本 Swing 书籍能够解释真正的 Swing 应用程序 发展过程。理想情况下,这样一本书将结合这些模式, 上面提到的架构和数据绑定技术 描述如何在 Swing 中实现它。无论如何,还有一个10岁的孩子 Smalltalk 应用程序开发过程的文档 就是这么做的。 Oracle 的 JClient 架构和文档不是 完整但对于 Java 开发人员来说可能更容易阅读。我提供 关于数据绑定的演示,其中涉及 Fowler 模式, 3 层架构和这些模式的 Swing 实现 自动数据绑定。我的 Binding 库的教程来源 可以帮助您熟悉适配器链和 ValueModel 界面。 MVP 模式的最佳文档可以在以下位置找到: Dolphin Smalltalk 文档。

一旦您选择了架构和桌面模式集,您就可以 应该解决以下更基本的 Swing 任务: 1) 改进 外观通过选择一套专业的look&feeling合适 对于您的目标平台集,2) 选择一个可以帮助您的布局系统 快速构建设计良好且一致的屏幕,3) 选择数据 验证解决方案,以及 4) 获取一包日常 Swing 解决方案 任务。

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

让我添加关于所谓的“MVC”框架的标准警告。摇摆 不使用 MVC,它使用修改后的模式。 MVC 经常 被错误引用和误解——尤其是在 Swing 的背景下。 此外,MVC 适合 UI 组件,而不适合应用程序。因此我 建议寻找反映的概念、解决方案和库 并使用 Swing 架构,而不是 MVC。

MVC 模式的发明者社区介绍了 ApplicationModel(现在称为Presentation Model)1993年左右; MVP 稍后跟随。在我看来,这两种模式更重要 对于 Swing 比 MVC 有用。最近的环境带来了 向更多受众展示的演示模型模式转向了新的模式 建筑:“波洛克”。有兴趣的读者可以google一下看看是如何实现的 与经常结合的适配器链不同 演示模型。

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

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

参考文献:福勒的进一步模式 -http://martinfowler.com/eaaDev http://martinfowler.com/eaaDev数据绑定演示 -http://www.jgoodies.com/articles/ http://www.jgoodies.com/articles/Smalltalk 应用程序开发流程 -http://www.cincom.com/downloads/pdf/AppDevGuide.pdf http://www.cincom.com/downloads/pdf/AppDevGuide.pdfMVP模式 文档 -http://www.object-arts.com/EducationCentre/Patterns/MVP.htm http://www.object-arts.com/EducationCentre/Patterns/MVP.htmSun 的 JDNC 项目首页-http://jdnc.dev.java.net/ http://jdnc.dev.java.net/Oracle 的 ADF 常见问题解答 -http://www.oracle.com/technology/products/jdev/htdocs/905/adffaq_otn.html http://www.oracle.com/technology/products/jdev/htdocs/905/adffaq_otn.htmlSpring RCP 项目主页 -http://www.springframework.org/spring-rcp.html http://www.springframework.org/spring-rcp.htmlNetBeans 平台主页 -http://www.netbeans.org/products/platform/ http://www.netbeans.org/products/platform/JGoodies 摇摆组曲 -http://www.jgoodies.com/products/index.html http://www.jgoodies.com/products/index.html

如果你不认识 Karsten 和 JGoodies,那么请相信我,这家伙真的知道他在说什么。我强烈建议仔细阅读他的回答and他发布的材料作为参考。更具体地说,一定要检查他的桌面模式和数据绑定推介会。令人惊讶的是,我更喜欢旧版 http://www.jgoodies.com/download/presentations/patterns-and-binding-old.pdf to the new one http://www.jgoodies.com/download/presentations/patterns-and-binding.pdf.

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

  • Yes, Swing 使用一个extended内部MVC形式
  • But MVC针对组件,MVP针对应用程序

然后从摘要中:

  • 将域与演示文稿分开!
    那是分开演示 http://martinfowler.com/eaaDev/SeparatedPresentation.html.
  • 分离自主视图 http://martinfowler.com/eaaDev/AutonomousView.html如果合适的话
  • Choose MVP http://martinfowler.com/eaaDev/ModelViewPresenter.html or 演示模型 http://martinfowler.com/eaaDev/PresentationModel.html
  • 摇摆使演示模型 http://martinfowler.com/eaaDev/PresentationModel.html easy
  • PM 需要一个绑定解决方案

但在解释这一点上我无法比卡斯滕做得更好,我最多只能解释他。所以就读他吧!

也许还可以看看用于学习的桌面 Java 演示 http://www.java.net/node/661990(更准确地说,斯科特·维奥莱特的answer http://www.java.net/node/661990#comment-665770).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用什么? MVC、MVP 或 MVVM 还是……? 的相关文章

  • 如何在 Ember 中构建递归视图?

    在我的应用程序中 我有一个名为block它可以包含其他内容并被其他内容包含block项目 为了简单起见 我们假设这些块可以无限嵌套 我想知道是否可以创建与嵌套块相对应的递归视图 每个视图都会被渲染为DIV包含其子级并驻留在其父级内部DIV
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • JSF - 实施受限页面过滤器

    我正在关注 BalusC 的回答JSF 2 0 如何获取在浏览器地址栏中输入的 URL https stackoverflow com questions 4105263 jsf 2 0 how to get the url that is
  • 删除数组中的重复元素[重复]

    这个问题在这里已经有答案了 可能的重复 在 JavaScript 数组中查找重复值的最简单方法 https stackoverflow com questions 840781 easiest way to find duplicate v
  • R:变换不规则时间字符串

    我有两个不同的时间序列 来自不同的数据帧 具有不同的不规则格式 但问题是相同的 我只想提取小时 分钟 秒和毫秒 时代系列看起来像这样 ts1 08 27 23 445 08 27 24 280 08 27 25 115 I tried st
  • nginx 解析器——dns

    请原谅一个非常初学者的问题 我无法理解 nginx 的 解析器 参数及其工作原理 我已阅读文档 搜索教程和帖子 使用解析器 nginx 和 dns 等关键字 但我仍然不确定如何应用解析器 http nginx org en docs htt
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • localhost/test.php 不返回任何内容

    我正在遵循教程构建一个网络应用程序 我创建了一个简单的test php网络空间中的文件 var www html 问题是当我输入localhost test php在浏览器地址窗口中 它返回一个空页面 我试过localhost php in
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons
  • PowerShell 解锁/卸载导入的 CSV

    早晨 我想问题就在标题里 我有一个脚本 它通过导入 CSV 的文件夹结构运行 与每个脚本一起工作 然后在完成后尝试删除它们 遗憾的是 其中很多都锁定在 PowerShell 上 而我删除它们的唯一方法就是关闭 PS 有什么方法可以卸载csv
  • 如何识别嵌套 json 文件并将其分解为数据框的列?

    我再次重新组织我的问题 以便更清楚 我的数据看起来像这样 Research xmlns http www xml org 2013 2 XML language eng createDateTime 2022 03 25T10 12 39Z
  • 如何将函数绑定到DOM事件一次且仅一次,以便在事件触发时不会再次执行?

    所以我有以下形式的锚标签 a href link 我在页面加载时应用以下内容 我的意思是 文档准备就绪 jQuery a rel Tab click function e e preventDefault then I do some st
  • 无法打开文件,路径='file:///path'(操作系统错误:没有这样的文件或目录,errno = 2)

    您好 我正在尝试使用图像库减小从图库中选取的图像大小 在尝试时我面临这样的错误 E flutter 13796 ERROR lib tonic logging dart error cc 16 Unhandled exception E f
  • UICollectionViewFlowLayout IOS的​​minimumLineSpacing属性

    对于UICollectionViewFlowLayout的属性minimumLineSpacing 苹果的文档说 对于垂直滚动网格 该值表示最小值 连续行之间的间距 对于水平滚动的网格 该值表示连续列之间的最小间距 我测试它和代码的一部分是
  • 在旧版本的 MySQL (<5.5.0) 中模拟 TO_SECONDS()

    出于性能和简单性的原因 我想以秒的形式获取 MySQL 3 x 服务器中 DATETIME 列的内容 或者实际上任何数字类型 我只是想在使用 UNIX TIMESTAMP 时避免所有明显的时区问题 the我表中的日期确实来自不同的区域设置
  • Android Studio:已选择组件,但属性编辑器显示“未选择组件”

    TL DR 虽然我可以直接在 XML 中编辑组件属性 健全性检查 我很理智 但属性检查器窗格声称没有选择任何内容 IE 这不起作用 我添加了一个CardView到主布局 它does显示在组件树和设计编辑器中 我选择的是CardView在 组
  • ES6 Bare Import:如何使用以及何时使用?

    ES6 允许我们使用新的导入语法 使用它 我们可以将模块导入到我们的代码中 或者这些模块的一部分 使用示例包括 Import the default export from a module import React from react
  • 最有用的用户制作的 C 宏(在 GCC 中,还有 C99)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AngularJs:当放置在 ng-view 标签内时,ng-include 不起作用

    我正在通过 ng view 内的角度路线加载 html 页面 我正在加载的页面包含一个 ng include 标签 指向 另一个 html 文件 我尝试了以下所有语法 div src div div div div src include
  • Grep 模式匹配用双引号括起来的小写字符串

    我在 grep 方面遇到了一些问题 我似乎无法弄清楚 我试图在一组源文件中搜索用双引号 C 字符串 括起来的小写单词的所有实例 使用 bash 和 gnu grep grep e a z cpp 没有给我任何匹配项 而 grep e a z
  • 如何检索 JQuery 数据表的排序状态

    我对 JQuery Datatables 还很陌生 我正在尝试检索有关数据表的两个信息 当前正在对哪个列索引进行排序 也称为选择 排序顺序 升序或降序 不知道我应该如何解决这个问题 使用 jquery 查找列索引 或者 Datatables
  • 用什么? MVC、MVP 或 MVVM 还是……?

    我将启动一个 Java 项目来开发桌面应用程序 使用什么作为表示层模式 MVC MVP MVVM 或 如果可能的话 举一些可行的小例子 Actually the ultimate post you re looking for is thi