MVC 还是 MVP?哪种设计模式最有意义?

2024-03-07

小伙伴们更喜欢哪一个呢?我一直在研究两者,人们对它们的称呼似乎确实存在一些不一致之处。

我会尝试记下差异,如果我错了,你可以纠正我。

MVC

  1. 模型保存对其自己的观察者(视图)的引用,在模型更新时它会通知观察者。
  2. 视图将所有事件和消息传递给控制器​​。当模型通知视图发生更改时,视图会更新其内容。视图保存对控制器和模型的引用。
  3. 控制器保存模型和(有时)视图。视图将调用与用户输入相对应的控制器方法,然后控制器相应地操作模型,有时还会操作视图(阻止某些视图单击上的按钮等)

MVP

  1. 模型没有对视图的引用。只为程序提供数据抽象。模型没有任何参考。
  2. 与在 MVC 中一样,视图根据用户输入调用相应的 Presenter 方法。 View 仅引用 Presenter。
  3. Presenter 有对视图和模型的引用。当 View 调用 Presenter 中的方法时,Presenter 会操作 Model,然后操作 View。

我很确定我了解 MVC 的工作原理,只是我的理解 MVP 是否有点不确定。我真的很喜欢 MVC,但唯一不适合我的是模型,它应该只是数据层的抽象,也保存对视图的引用并进行更新。这没有道理。


马丁·福勒提供了一个analysis http://www.martinfowler.com/eaaDev/uiArchs.htmlMVC 和 MVP 以及 WikipediaMVP http://en.wikipedia.org/wiki/Model-view-presenter#cite_note-3文章给出了更多参考。

对我来说,有两个问题:

1)。模型-视图关系的“活跃度”如何?如果模型动态变化,并且视图必须更新以反映模型变化,那么我们就有经典的 MVC,并且模型以某种方式通知相关视图的变化。此样式不适用于经典 Web 应用程序(例如在 Struts 中实现的)。这里通常会创建一个作为模型快照的一个视图(实际上通常是在模型提供的 DTO 上)。在许多文献中,Web 风格仍然称为 MVC。

2)。当用户做“某事”时,谁负责解释和行动。在 MVC 中,这通常是控制器的工作。为此,MVP 似乎允许从视图到模型进行更直接的交互(如果我正确理解 Fowlers 文章的话)。

我更喜欢干净的关注点分离 - MVC 方法是我的想法,但这可能只是一个熟悉的事情。

一个人应该选择什么?一般来说,我认为您是由您选择使用的框架驱动的。我有 Struts 背景,所以 Web 风格的 MVC 对我来说很自然。如果我理解正确的话,MVP 在 .NET 的某些方面得到了明确的采用。我会遵循您选择的任何框架的流程,并且我不会仅仅因为它是 MVP 而不是 MVC 就拒绝一个框架 - 即使假设可以进行明确的区分。

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

MVC 还是 MVP?哪种设计模式最有意义? 的相关文章

  • 方法链接的优点和缺点以及用对象本身替换所有 void 返回参数的可能性

    我最感兴趣的是Java 但我认为这是一个普遍的问题 最近我一直在使用 Arquillian 框架 ShrinkWrap 使用了大量的方法链 方法链的其他示例是以下方法StringBuilder StringBuffer 使用这种方法有明显的
  • 实体框架的状态模式

    我有一个模型Enquiry 它可以处于两种状态之一 还有更多状态 但出于此目的 我将仅比较两种状态 New and Closed 查询所处的状态取决于用户能够对查询执行什么操作 例如 无法删除已关闭的查询 而可以删除新的查询等等 基本示例
  • 这叫什么类型的建筑?

    对于我当前正在开发的 Web 应用程序 ASP NET MVC 我们采用以下架构 Data Access Layer 将数据持久保存到任意数据库的逻辑 Domain 数据模型 Service Layer 业务逻辑 例如订单处理 账户管理等
  • 我什么时候应该从正在观察持久模型类的正在关闭的 ViewController 类中调用removeObserver:forKeyPath?

    我有一个ViewController具有一个属性的类 该属性是我想要观察模型属性变化的模型 在我的模型对象中 我有一个在应用程序后台定期更新的属性 当它更新时 我需要在我的内部执行代码ViewController 为此 我从我的模型中创建了
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • 使用“旧”对象引用使用构建器模式创建新对象

    我正在尝试构建器模式 并陷入如何向新创建的对象添加新 属性 的困境 public class MsProjectTaskData private boolean isAlreadyTransfered private String req
  • 用简单的英语来说,什么是单例?

    我已经在谷歌上搜索了大约一个小时 但我仍然不清楚什么是单例 谁能让我更清楚一点 也许可以发布一个代码示例 我所知道的是 一个给定类只能有一个实例 但是你不能为此使用静态类吗 提前致谢 The simple plain English1 ve
  • C++ 包装类的设计

    我必须使用一个界面非常笨拙的旧类 由于我无法更改它并且依赖它 因此我想构建一个包装器 提供一个干净的界面 假设我有课笨手笨脚的班级 基本上 我有三种方法 1 参考会员 Class Wrapper public Wrapper ClumsyC
  • 使用 Doctrine2 时的多重歧视级别

    我正在使用 Doctrine2 来管理我的模型 如下 有一个抽象概念Content与复合模式Gallery 也是一个抽象概念Media从中Video and Image继承 我的选择是添加鉴别器Content and Media表以便区分G
  • 在 asp.net MVC 控制器中调用异步外部 Web 服务

    在 Asp net MVC 控制器 GET 方法 中 我调用外部 Web 服务 用于 IP 地理定位 返回 IP 位置的 json 数据 如何使调用异步 以便堆栈可以在等待服务响应时继续 当 GEO IP 请求完成后 我希望能够更新数据库
  • “TryParse / Parse like”模式:实现它的最佳方法是什么

    这个问题是来自的后续问题如何指示方法不成功 https stackoverflow com questions 161822 how to indicate that a method was unsuccessful xxx Tryxxx
  • Backbone-relational 无法实例化两个 RelationalModel 对象

    我正在尝试实现 BackboneRelational 并不断获得 无法实例化多个 Backbone RelationalModel 每种类型都有相同的 ID class App Models User extends Backbone Re
  • 我对 MVVM 模式有一些疑问

    我叫 Jes s 来自西班牙 是一名 NET 开发人员 几天前我刚刚发现了这个伟大的网络 我有一些关于 MVVM 模式的问题 如果您能回答我 我将很高兴 我三个月前开始使用 WPF 并且学习了 MVP 模式 MVP 非常好 因为您可以很好地
  • iostream 对象 cin、cout、cerr 和 clog 是如何实现的?

    iostream 对象 cin cout cerr 和 clog 是在 iostream 标头中声明的对象 我知道在某些编译器中可能会在构造这些 iostream 对象之前尝试使用它们 因此在某些情况下它们必须受到 静态初始化顺序失败 的影
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 工厂模式中创建者的角色

    我无法理解为工厂类定义抽象类 接口的作用 这是我在网络上的所有教程中总是看到的东西 有人可以阐明 CreatorInterface 的重要性吗 工厂模式参考UML图 https i stack imgur com 3VpUM png 为了以
  • 工厂模式但带有对象参数

    采用以下经典工厂模式 public interface IPizza decimal Price get public class HamAndMushroomPizza IPizza decimal IPizza Price get re
  • 设置 MVC 下拉列表中日期的格式

    我的页面上有一个下拉列表 如下所示 Html DropDownList dd dates new SelectList Model seasonDates Please Select 其中 seasonDates 是日期的 IList 问题
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl

随机推荐

  • 在连接之间共享事务

    我有一个 FileShare 爬虫 获取权限并将其放在某处以供以后审核 目前 它正在启动多个线程来抓取同一文件夹 以加快进程 在 C 中 每个SqlConnection对象有自己的SqlTransaction 由SqlConnection
  • Inno Setup - 检查目标中是否存在文件,否则不会中止安装

    我需要我的安装程序检查目标位置中是否存在文件 如果不存在 则安装将中止 我的项目是一个更新补丁 因此我希望安装程序在应用程序的主 exe 不在目标中时避免安装更新文件 我怎样才能做到这一点 有人可以给出一个通过 Windows 注册表检查文
  • Spring JdbcTemplate批量更新处理异常

    目前我们的代码使用JdbcTemplate的batchUpdate方法来进行批量插入 我的问题是 如果其中一个更新出现任何异常 如何处理它 假设仅通过添加日志 并继续下一个更新 sql 语句 另外 JdbcTemplate 的 batchU
  • 多租户隔离数据库上的 DAL 和配置最佳实践

    我的公司拥有十几个网站和独立的数据库 相同的模式 每个客户都有自己的网站 不同的应用程序池 和数据库 每个网站都有自己的配置 多个连接字符串 但它们都有相同的配置架构 cust1 domain com cust2 domain com cu
  • Flutter NSException:配置失败。可能是GoogleService-Info.plist中的GOOGLE_APP_ID无效或自定义选项中设置的无效造成的

    GoogleService Info plist文件是通过添加的将文件添加到 Runner 选项 所以 它位于 Runner 目录中 我已经检查了很多堆栈溢出答案 但无法找出问题所在 我还重新检查 GoogleService Info pl
  • 重叠标签ggmap

    我有谷歌地图和带有文本标签的坐标列表 当我预览时 标签重叠 因此变得不可读 library ggmap WPmap lt qmap c lon 4 80324 lat 52 40738 zoom 12 source google 表kaar
  • Java:乘以通用数字而不改变其类型

    Java中有没有办法实现这个方法 public static
  • Android Studio 1.5.1 中的 Lint 不适用于缺失权限检测

    目前 我正在将我的应用程序迁移到目标 API 23 我花了一段时间才弄清楚原因accountManager getAccountsByType com google 不再工作了 这是由于新的 Marshmallow 权限模型 http de
  • 哪些编程语言功能非常适合开发实时编码框架?

    我想建立一个 实时编码框架 我应该解释一下 实时编码框架 的含义 我将通过比较实时编码与传统编码来做到这一点 一般来说 在传统编程中 您编写代码 有时编译它 然后启动可执行文件或在某种解释器中打开脚本 如果您想修改您的申请 则必须重复此过程
  • 我如何告诉 Bazel Python.h 所在的位置?

    我正在构建一个 C 可执行文件 需要从用户的 Python 安装中 include Python h 为了在 Bazel 中表达 Python h 及其包含的各种头文件 我需要知道 Python 包含目录在哪里 这个位置在 Windows
  • 如何在Restlet 2.3.1中使用CORS?

    我正在尝试设置响应的 Access Control Allow Origin 标头 但是 标头不存在 我究竟做错了什么 public class JsonApplication extends Application private sta
  • 如何在Bootstrap中删除这个水平滚动条

    我的引导页面上有这个令人恼火的水平滚动 无法弄清楚是什么导致它出现这样的行为或该怎么办 JsFiddle链接 http jsfiddle net FatAlbert cd1syrd9 2 http jsfiddle net FatAlber
  • 在 Angular2/TypeScript 项目中使用 es6-shim

    我想将 es6 的 Map 用于 Angular2 typescript 项目 我想实现这一目标的方法是通过 es6 shim 库 但是我真的很困惑我应该如何做到这一点 这是我到目前为止所做的 在我的根index html文件中我有这个 上
  • FormData 对象未通过 jQuery AJAX 调用提交

    我使用此脚本从表单中获取所有值 以便为 ajax 请求做好准备 function saveDataAjax var fd new FormData var inputs document getElementsByTagName input
  • 在cocos2d中平滑拖动Sprite - iPhone

    我已经实现了对精灵对象的拖动 如下所示 BOOL ccTouchesMoved NSSet touches withEvent UIEvent event UITouch touch touches anyObject CGPoint lo
  • 在查询中参数化 WHERE 子句

    环境 C 视觉工作室2012 NET框架3 5 Hi 我可以在 SQL Server 中参数化 where 子句吗 在我的场景中 一旦输入 WHERE 子句字符串 应用程序会将其连接到查询的其他部分并在 SQL Server 中执行 然后返
  • 如何修复 antlr4 词法分析器规则中的“不允许多字符文字”错误?

    我想写的规则是 Character u0000 u10FFF 但是 当尝试针对定义它的词法分析器文件运行 antlr 工具时 出现以下错误 multi character literals are not allowed in lexer
  • 谷歌玩游戏实时多人游戏如何获得快速匹配玩家的名字?

    我正在尝试使用 google API 来制作我的实时多人游戏 我注意到每次玩家使用 随机匹配 选项互相玩游戏时 他们的 ID 都与他们实际的 google ID 不同 有没有办法在随机匹配中检索他们的实际 google ID 并且不使用这些
  • AppComponent中的错误无法用作入口组件

    嘿 我是使用 Angular 和 Web 开发的新手 我已经浏览了一些教程 当尝试合并使用我的 Firebase 数据库时 在本地编译 使用 ng 服务 时 我的应用程序失败 返回 AppComponent不能用作入口组件 如果您能提供任何
  • MVC 还是 MVP?哪种设计模式最有意义?

    小伙伴们更喜欢哪一个呢 我一直在研究两者 人们对它们的称呼似乎确实存在一些不一致之处 我会尝试记下差异 如果我错了 你可以纠正我 MVC 模型保存对其自己的观察者 视图 的引用 在模型更新时它会通知观察者 视图将所有事件和消息传递给控制器