什么是MVP和MVC,有什么区别?

Mik*_*llo 2081 model-view-controller mvp user-interface glossary design-patterns

当超越RAD(拖放和配置)构建用户界面的方式时,许多工具鼓励您可能会遇到三种设计模式,称为模型 - 视图 - 控制器,模型 - 视图 - 展示器模型 - 视图 - 视图模型.我的问题有三个部分:

  1. 这些模式解决了哪些问题?
  2. 它们如何相似?
  3. 他们有什么不同?

Gle*_*ock 1954

模型 - 视图 - 演示

MVP中,Presenter包含View的UI业务逻辑.View中的所有调用都直接委托给Presenter.Presenter也直接与View分离,并通过界面与之对话.这是为了允许在单元测试中模拟View.MVP的一个常见属性是必须进行大量的双向调度.例如,当有人单击"保存"按钮时,事件处理程序将委托给Presenter的"OnSave"方法.保存完成后,Presenter将通过其界面回调View,以便View可以显示保存已完成.

MVP往往是在Web窗体中实现单独呈现的非常自然的模式.原因是View总是首先由ASP.NET运行时创建.您可以找到有关这两种变体的更多信息.

两个主要变化

被动视图:视图尽可能愚蠢,几乎没有逻辑.演示者是一个与视图和模型对话的中间人.视图和模型完全相互屏蔽.模型可能会引发事件,但Presenter会订阅它们以更新视图.在被动视图中没有直接数据绑定,而是View公开了Presenter用于设置数据的setter属性.所有状态都在Presenter中管理,而不是View.

  • Pro:最大可测性表面; 清晰分离视图和模型
  • Con:更多工作(例如所有setter属性),因为您自己正在进行所有数据绑定.

监督控制器:演示者处理用户手势.View直接通过数据绑定绑定到Model.在这种情况下,Presenter的工作是将Model传递给View,以便它可以绑定到它.演示者还将包含手势逻辑,如按下按钮,导航等.

  • Pro:通过利用数据绑定,减少了代码量.
  • Con:表面上可测试的表面较少(因为数据绑定),并且View中的封装较少,因为它直接与Model进行对话.

模型 - 视图 - 控制器

MVC中,Controller负责确定响应任何操作(包括何时加载应用程序)而显示哪个View.这与MVP不同,其中操作通过View路由到Presenter.在MVC中,View中的每个操作都与对Controller的调用以及操作相关联.在网络中,每个动作都涉及对URL的调用,在URL的另一侧有一个Controller响应.控制器完成处理后,将返回正确的视图.在整个应用程序的生命周期中,序列以这种方式继续:

    Action in the View
        -> Call to Controller
        -> Controller Logic
        -> Controller returns the View.

MVC的另一个重要区别是View不直接绑定到Model.视图简单地呈现,并且完全是无状态的.在MVC的实现中,View通常不会在后面的代码中有任何逻辑.这与MVP完全相反,因为如果View没有委托给Presenter,它将永远不会被调用.

演示模型

要看的另一种模式是Presentation Model图案.在这种模式中没有Presenter.相反,View直接绑定到Presentation Model.Presentation Model是专为View设计的模型.这意味着此模型可以公开一个永远不会放在域模型上的属性,因为它会违反关注点分离.在这种情况下,表示模型绑定到域模型,并可以订阅来自该模型的事件.View然后订阅来自Presentation Model的事件并相应地更新自身.表示模型可以公开视图用于调用操作的命令.这种方法的优点在于,您可以完全删除代码隐藏,因为PM完全封装了视图的所有行为.Model-View-ViewModel.

关于演示模型MSDN文章WPF(前Prism)的复合应用指南中有关分离演示模式的部分

  • 你能澄清一下这句话吗?*这与MVP不同,其中动作通过视图路由到演示者.在MVC中,View中的每个动作都与一个Controller的调用以及一个动作相关联.*对我而言,它听起来是一样的,但我确信你描述的是不同的东西. (24认同)
  • @Panzercrisis我不确定这是否是作者的意思,但这是我认为他们试图说的.像这个答案 - http://stackoverflow.com/a/2068/74556提到,在MVC中,控制器方法基于行为 - 换句话说,您可以将多个视图(但相同的行为)映射到单个控制器.在MVP中,演示者更靠近视图耦合,并且通常导致更接近一对一的映射,即视图动作映射到其对应的演示者的方法.您通常不会将另一个视图的操作映射到另一个演示者(来自另一个视图)方法. (16认同)
  • **请注意** `MVC` 通常由 `Laravel` 这样的 Web 框架使用,其中接收到的 URL 请求(可能由用户发出)由 `Controller` 处理,并发送由 `View` 生成的 HTML对于客户端来说——因此,“View”是 *后端* 的一部分,用户永远无法直接访问它,如果您在任何地方遇到相反的情况,请考虑将其视为 MVC 扩展(甚至违规)。@Panzercrisis,这与“MVP”(如“Android”操作系统中使用的“MVP”不同),其中“操作通过视图路由到演示者”,并且用户可以直接访问“视图”。 (4认同)
  • 作者在谈到 MVC 时描述的并不是原始的 Smalltalk MVC(其流程是三角形的),而是控制器使用模型渲染视图并将其返回给用户的“Web MVC”。我认为这是值得注意的,因为这会造成很多混乱。 (2认同)

Phy*_*yxx 436

这是对这些设计模式的许多变体的过度简化,但这就是我喜欢考虑两者之间差异的方式.

MVC

MVC

MVP

在此输入图像描述

  • 这是对原理图的一个很好的描述,显示了从演示者的API中抽象和完全隔离任何GUI相关(查看内容).一个小问题:可以在只有一个演示者的情况下使用主演示者,而不是每个视图一个,但您的图表是最干净的.IMO,MVC/MVP之间的最大区别在于MVP试图使视图完全没有显示当前"视图状态"(视图数据)以外的任何内容,同时也禁止视图对Model对象的任何了解.因此需要在那里的接口注入该状态. (9认同)
  • 好照片.我使用MVP非常多,所以我想提出一点.根据我的经验,演示者需要经常互相交谈.模型(或业务对象)也是如此.由于这些额外的"蓝线"通信将出现在您的MVP图片中,因此Presenter-Model关系可能变得非常纠结.因此,我倾向于保持一对一的Presenter-Model关系与一对多关系.是的,它需要在模型上使用一些额外的委托方法,但如果模型的API发生变化或需要重构,它会减少许多令人头疼的问题. (4认同)
  • MVC的例子是错的; 视图和控制器之间存在严格的1:1关系.根据定义,控制器解释人类手势输入,以便为单个控件生成模型和视图的事件.更简单地说,MVC仅用于单独的小部件.一个小部件,一个视图,一个控件. (3认同)
  • @StuperUser - 当我写这篇文章时,不确定我在想什么.当然,你是对的,回顾我写的内容,我不得不怀疑自己是否还有其他一些我没有说清楚的背景.谢谢你的纠正. (3认同)
  • @ SamuelA.FalvoII并不总是有一个1:在ASP.NET MVC控制器和视图之间有许多:http://stackoverflow.com/questions/1673301/should-an-mvc-controller-and-view-have-a -1到1的关系 (2认同)
  • MVC 和 MVP 之间有两个主要区别。1.在MVC中View直接从Model获取数据,在MVP中View从Presenter获取数据。2. 在 MVC 中,每个视图可以有一个控制器,但在 MVP 中,每个视图只能有一个演示者。你的照片只显示了第二个区别,所以在我看来答案是不完整的。 (2认同)

Jon*_*jap 412

我前段时间在博客上发表了这篇文章,引用了托德·斯奈德关于两者之间差异的优秀帖子:

以下是模式之间的主要区别:

MVP模式

  • 视图与模型的关系更松散.演示者负责将模型绑定到视图.
  • 更容易进行单元测试,因为与视图的交互是通过接口进行的
  • 通常一对一地查看演示者地图.复杂视图可能有多个演示者.

MVC模式

  • 控制器基于行为,可以跨视图共享
  • 可以负责确定要显示的视图

这是我能找到的网上最好的解释.

  • @pst:MVP真的是1 View = 1 Presenter.使用MVC,Controller可以管理多个视图.就是这样,真的.使用"tabs"模型可以想象每个选项卡都有自己的Presenter,而不是所有选项卡都有一个Controller. (17认同)
  • 我不明白在两种情况下,视图中是如何或多或少地与模型耦合的,因为整个点都要将它们完全分离.我并不是说你说错了什么 - 只是对你的意思感到困惑. (14认同)
  • 最初有两种类型的控制器:您说过在多个视图中共享的控制器,以及特定于视图的控制器,主要用于调整共享控制器的接口. (4认同)
  • 托德(Todd)的MVC图解说明与将视图和模型分离的想法完全矛盾。如果查看该图,它会显示“模型更新视图”(从模型到视图的箭头)。在哪个Universe中是一个系统,其中Model直接与View交互,即一个分离的View? (2认同)

Ash*_*hir 251

以下是代表通信流程的插图

在此输入图像描述

在此输入图像描述

  • 如果用户单击按钮,那么该怎么不与视图交互?我觉得在MVC中,用户与视图的交互比控制器更多 (53认同)
  • 我对MVC图有疑问.我没有得到视图出来的部分来获取数据.我认为控制器将转发到具有所需数据的视图. (43认同)
  • @JonathanLeaders当人们说"MVC"时,人们会想到不同的东西.创建此图表的人可能考虑了经典的Web MVC,其中"用户输入"是HTTP请求,"返回给用户的视图"是呈现的HTML页面.因此,从经典Web MVC应用程序的作者的角度来看,用户和视图之间的任何交互都"不存在". (15认同)
  • @RobP.我认为这些类型的图表往往过于复杂或过于简单.Imo MVP图表的流程也适用于MVC应用程序.根据语言特性(数据绑定/观察者),可能存在变化,但最终的想法是将视图与应用程序的数据/逻辑分离. (6认同)
  • 我知道这是一个陈旧的答案 - 但任何人都可以对@JonathanLeaders点做出回应吗?我来自winforms背景,除非你做了一些非常独特的编码,当你点击UI/View之前获得该点击的知识之前.至少,据我所知? (5认同)
  • 如果用户坐在那里输入 curl 命令,@cubuspl42 将适用。我明白你在说什么,但现实是人们点击按钮,然后发送 HTTP 请求。人们不是通过命令行或其他方式发送请求。甚至经典的 Web(lynx 或 Netscape Navigator 任何人?)都是这种方式。 (2认同)
  • 哦,哇,可能是我见过的两种模式中最差的图解表示。对于MVP,没有显示视图界面的指示。但更令人讨厌的是,图中的MVC中有一个从View到Model的链接。这些模式旨在促进去耦。如果View直接查询Model,则看不到这种情况。而且,如果要这样做,为什么还要有一个中间层(笑)?只有两层,并称为模式VM。稍后,中间点的重点是让View不(也不应该)了解Model。 (2认同)

Qui*_*ome 167

MVP是不是一定是这样一个场景,查看负责(见Taligent公司的MVP为例).
我发现不幸的是,人们仍在宣传这种模式(负责观点),而不是反模式,因为它与"它只是一种观点"(实用程序员)相矛盾."这仅仅是一种观点"指出向用户显示的最终视图是应用程序的次要问题.微软的MVP模式使得重复使用Views变得更加困难,并且方便了微软的设计师鼓励不良做法.

坦率地说,我认为MVC的潜在问题适用于任何MVP实现,差异几乎完全是语义的.只要您关注视图(显示数据),控制器(初始化和控制用户交互)和模型(基础数据和/或服务)之间的关注点分离,那么您就可以实现MVC的优势.如果您正在获得好处,那么谁真正关心您的模式是MVC,MVP还是监督控制器?唯一真实的模式仍然是MVC,其余的只是不同的风格.

考虑这篇非常令人兴奋的文章,它全面列出了许多不同的实现.您可能会注意到,他们基本上都在做同样的事情,但略有不同.

我个人认为MVP最近才被重新引入作为一个吸引人的术语,要么减少语义偏执者之间的争论,他们争论某些东西是否真的是MVC,或者证明微软快速应用程序开发工具的合理性.在我的书中,这些原因都不能证明它作为一种单独的设计模式存在.

  • 我已经阅读了几个关于MVC/MVP/MVVM/etc之间差异的答案和博客.实际上,当你开始做生意时,它们都是一样的.无论您是否有接口,以及您是否使用了setter(或任何其他语言功能),这并不重要.似乎这些模式之间的差异源于各种框架实现的差异,而不是概念问题. (27认同)
  • 我不会把MVP称为*反模式*,因为后面的帖子"......其余的[包括MVP]只是[MVC]的不同风格......",这意味着如果MVP是一个反模式MVC也是如此......它只是一种不同框架方法的风格.(现在,某些*特定的*MVP实现可能比某些*特定的*MVC实现或多或少更适合不同的任务......) (6认同)
  • @ Hibou57,没有什么可以阻止MVC将视图作为接口引用或为几个不同的视图创建通用控制器. (6认同)
  • 塞缪尔请澄清你在说什么。除非您告诉我“发明”MVC 的团队的历史,否则我对您的文本非常怀疑。如果您只是谈论 WinForm,那么还有其他方法可以做事,我创建了 WinForm 项目,其中控件绑定由控制器管理,而不是“单独的控件”。 (2认同)

Bri*_*ahy 107

MVP:视图负责.

在大多数情况下,视图会创建其演示者.演示者将与模型交互并通过界面操纵视图.视图有时会通过某种界面与演示者进行交互.这归结为实施; 您希望视图在演示者上调用方法,还是希望视图包含演示者侦听的事件?它归结为:视图了解演示者.视图委托给演示者.

MVC:控制器负责.

根据某些事件/请求创建或访问控制器.然后,控制器创建适当的视图并与模型交互以进一步配置视图.它归结为:控制器创建和管理视图; 视图是控制器的从属.视图不知道控制器.

  • @Brian:"在大多数情况下,视图会创建它的演示者." 我主要看到相反的情况,Presenter启动模型和视图.好吧,View也可以推出Presenter,但这一点并不是最独特的.重要的是最有可能在一生中发生. (4认同)
  • "View不了解Controller." 我认为你的意思是该视图与模型没有直接联系? (3认同)
  • 视图永远不应该知道模型中的模型. (2认同)
  • 您可能需要编辑答案以进一步解释:由于视图不了解控制器,因此如何将用户在屏幕上看到的“视觉”元素(即视图)上执行的用户操作传达给控制器... (2认同)

AVI*_*AVI 77

在此输入图像描述

MVC(模型视图控制器)

输入首先指向Controller,而不是视图.该输入可能来自与页面交互的用户,但也可能只是将特定URL输入到浏览器中.在任何一种情况下,它都是一个与之连接的控制器,以启动某些功能.Controller和View之间存在多对一关系.这是因为单个控制器可以基于正在执行的操作选择要呈现的不同视图.请注意从Controller到View的单向箭头.这是因为View对控制器没有任何了解或参考.Controller确实传回了Model,因此View和传递给它的预期模型之间存在知识,但是不是Controller提供它.

MVP(模型视图演示者)

输入以View开头,而不是Presenter.View与关联的Presenter之间存在一对一映射.View包含对Presenter的引用.Presenter也对从View触发的事件做出反应,因此它知道与之关联的View.Presenter根据它在Model上执行的请求操作更新View,但View不支持Model.

有关更多参考

  • 在MVC中从模型到视图的链接?给定此链接,您可能需要编辑答案以说明如何使它成为“解耦”系统。提示:您可能会发现很难。另外,除非您认为读者会很乐意接受他们一生都在错误地计算,否则您可能想详细说明为什么尽管用户与屏幕上的“视觉”元素进行了交互,但操作还是首先通过MVC通过Controller处理(例如,视图),而不是处理后的抽象层。 (2认同)
  • 这显然是错误的……在MVC中,模型永远不会直接与视图对话,反之亦然。他们甚至不知道其他人存在。控制器是将它们粘合在一起的粘合剂 (2认同)

Ali*_*Nem 53

这个问题有很多答案,但我觉得需要一些非常简单的答案,清楚地比较两者.以下是用户在MVP和MVC应用中搜索电影名称时所做的讨论:

用户:点击点击...

观点:那是谁?[ MVP | MVC ]

用户:我刚刚点击了搜索按钮......

查看:好的,等一下...... [ MVP | MVC ]

(查看调用Presenter | Controller ...)[ MVP | MVC ]

观点:嘿主持人 | 控制器,用户刚刚点击搜索按钮,我该怎么办?[ MVP | MVC ]

主持人 | 控制器:嘿View,该页面上有搜索词吗?[ MVP | MVC ]

观点:是的,......这里是......"钢琴"[ MVP | MVC ]

主持人:谢谢观看,...同时我正在查找模型上的搜索词,请向他/她显示进度条[ MVP | MVC ]

(Presenter | Controller正在调用Model ...)[ MVP | MVC ]

主持人 | 控制器:嘿模型,你对这个搜索词有什么匹配吗?:"piano"[ MVP | MVC ]

型号:嘿Presenter | 控制器,让我查一下...... [ MVP | MVC ]

(模型正在对电影数据库进行查询......)[ MVP | MVC ]

( 过了一会儿 ... )

--------------这就是MVP和MVC开始分歧的地方---------------

型号:我为你找到了一个列表,Presenter,这里是JSON"[{"name":"Piano Teacher","year":2001},{"name":"Piano","year":1993} ]"[ MVP ]

型号:有一些结果可用,控制器.我在我的实例中创建了一个字段变量,并用结果填充它.它的名字是"searchResultsList"[ MVC ]

(演示者 | 控制器感谢模型并返回视图)[ MVP | MVC ]

主持人:感谢等待观看,我找到了一份匹配结果列表,并以一种可呈现的格式排列:["Piano Teacher 2001","Piano 1993"].请在垂直列表中向用户显示.也请现在隐藏进度条[ MVP ]

控制器:感谢您等待View,我向Model询问了您的搜索查询.它说它找到了一个匹配结果列表,并将它们存储在其实例中名为"searchResultsList"的变量中.你可以从那里得到它.也请现在隐藏进度条[ MVC ]

观点:非常感谢Presenter [ MVP ]

查看:谢谢"控制器"[ MVC ](现在视图正在质疑:我应该如何呈现从模型中获得的结果给用户?电影的制作年份应该是第一个还是最后一个......?应该是在垂直或水平列表?...)

如果你有兴趣,我一直在写了一系列的应对伴随GitHub库的应用程序架构模式(MVC,MVP,MVVP,干净的架构,...)的文章在这里.尽管该示例是为Android编写的,但基本原则可以应用于任何介质.

  • 在适当的MVC中,视图调用控制器上的功能,并侦听模型中的数据更改。该视图未从控制器获取数据,并且控制器不应告知该视图显示(例如)加载指示器。适当的MVC允许您用根本不同的视图部分替换视图部分。视图部分包含视图逻辑,其中包括加载指示符。该视图调用(在控制器中)指令,控制器修改模型中的数据,模型将其数据更改通知给其侦听器,这种侦听器就是视图。 (3认同)

Bre*_*tra 35

  • MVP =模型 - 视图 - 演示者
  • MVC =模型 - 视图 - 控制器

    1. 两种演示模式.它们将模型(思考域对象),屏幕/网页(视图)以及UI的行为方式之间的依赖关系分开(演示者/控制器)
    2. 它们在概念上非常相似,人们根据品味不同地初始化Presenter/Controller.
    3. 关于差异的一篇很棒的文章就在这里.最值得注意的是,MVC模式具有模型更新视图.

  • 模型更新。这仍然是一个解耦的系统吗? (2认同)

Jon*_*esø 33

另外值得记住的是,MVP也有不同类型.福勒已经将模式分解为两个 - 被动视图和监督控制器.

使用被动视图时,View通常会实现细粒度的界面,其属性或多或少地直接映射到底层UI小部件.例如,您可能拥有一个ICustomerView,其中包含Name和Address等属性.

您的实现可能如下所示:

public class CustomerView : ICustomerView
{
    public string Name
    { 
        get { return txtName.Text; }
        set { txtName.Text = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

您的Presenter类将与模型对话并将其"映射"到视图中.这种方法称为"被动视图".好处是视图易于测试,并且在UI平台(Web,Windows/XAML等)之间移动更容易.缺点是您无法利用数据绑定等功能(在WPFSilverlight等框架中非常强大).

MVP的第二种风格是监督控制器.在这种情况下,您的View可能有一个名为Customer的属性,然后再将其数据绑定到UI小部件.您不必考虑同步和微观管理视图,监督控制器可以在需要时介入并提供帮助,例如使用编译的交互逻辑.

MVP的第三个"风味"(或者有人可能称之为单独的模式)是Presentation Model(或者有时称为Model-View-ViewModel).与MVP相比,您将M和P"合并"为一个类.您拥有UI小部件所绑定的客户对象,但您还有其他UI特定字段,如"IsButtonEnabled"或"IsReadOnly"等.

我认为我在UI架构中找到的最好的资源是Jeremy Miller在The Build Your Own CAB系列目录中完成的一系列博客文章.他涵盖了MVP的所有风格,并展示了C#代码来实现它们.

我还在YouCard重新访问过的Silverlight环境中发布了有关Model-View-ViewModel模式的博客:实现ViewModel模式.


Rah*_*hul 28

模型 - 视图 - 控制器

MVC是软件应用程序体系结构的模式.它将应用程序逻辑分为三个独立的部分,促进了模块化,易于协作和重用.它还使应用程序更灵活,更欢迎迭代.它将应用程序分为以下组件:

  • 处理数据和业务逻辑的模型
  • 用于处理用户界面和应用程序的控制器
  • 用于处理图形用户界面对象和表示的视图

为了使这一点更加清晰,让我们设想一个简单的购物清单应用程序.我们想要的只是我们本周需要购买的每件商品的名称,数量和价格清单.下面我们将描述如何使用MVC实现某些功能.

在此输入图像描述

模型 - 视图 - 演示

  • 模型是将在视图(用户界面)中显示的数据.
  • 视图是显示数据(模型)和路线用户命令(事件)给演示根据数据起作用的接口.该视图通常引用其Presenter.
  • 演示是"中间人"(由控制器在MVC饰演),并具有两个,视图和模型引用.请注意,"模型"一词具有误导性.它应该是检索或操作模型的业务逻辑.例如:如果您有一个数据库在数据库表中存储User并且您的View想要显示用户列表,那么Presenter将引用您的数据库业务逻辑(如DAO),Presenter将从该列表中查询列表用户.

如果您想查看具有简单实现的示例,请查看 github帖子

从数据库查询和显示用户列表的具体工作流程可以这样工作: 在此输入图像描述

有什么区别之间的MVCMVP模式?

MVC模式

  • 控制器基于行为,可以跨视图共享

  • 可以负责确定要显示的视图(Front Controller Pattern)

MVP模式

  • 视图与模型的关系更松散.演示者负责将模型绑定到视图.

  • 更容易进行单元测试,因为与视图的交互是通过接口进行的

  • 通常一对一地查看演示者地图.复杂视图可能有多个演示者.

  • 不,在mvc中,视图和模型之间没有直接联系。你的图是错误的。 (2认同)

Xia*_* Ge 23

它们各自解决了不同的问题,甚至可以组合在一起,形成如下所示的东西

组合模式

这里还有MVC,MVP和MVVM的完整比较


Mat*_*ell 18

这两个框架都旨在分离关注点 - 例如,与数据源(模型)的交互,应用程序逻辑(或将此数据转换为有用信息)(Controller/Presenter)和显示代码(View).在某些情况下,模型也可用于将数据源转换为更高级别的抽象.一个很好的例子是MVC Storefront项目.

这里讨论 MVC与MVP之间的区别.

区别在于,MVC应用程序传统上具有视图,并且控制器与模型交互,但彼此不交互.

MVP设计让Presenter访问模型并与视图交互.

话虽如此,ASP.NET MVC通过这些定义是一个MVP框架,因为Controller访问模型来填充View,这意味着没有逻辑(只显示Controller提供的变量).

要想了解ASP.NET MVC与MVP的区别,请查看Scott Hanselman的MIX演示文稿.

  • MVC和MVP是模式,而不是框架.如果你老实地认为,那个话题是关于.NET框架的,那么就像听到"互联网"并认为它是关于IE的. (7认同)

Nik*_*vic 13

两者都是试图将表示和业务逻辑分开,将业务逻辑与UI方面分离的模式

在架构上,MVP是基于页面控制器的方法,其中MVC是基于前端控制器的方法.这意味着在MVP标准Web表单中,页面生命周期只是通过从后面的代码中提取业务逻辑来增强.换句话说,页面是服务http请求的页面.换句话说,MVP恕我直言是网络形式的进化类型的增强.MVC另一方面完全改变了游戏,因为在加载页面之前,控制器类拦截了请求,在那里执行了业务逻辑,然后在控制器处理刚刚转储到页面的数据("view")的最终结果中感觉,MVC对于使用路由引擎增强的MVP的监督控制器风格看起来(至少对我而言)很多

它们都能实现TDD并具有缺点和优势.

关于如何选择其中一个的决定恕我直言应该基于投入ASP NET网络表单类型的Web开发的时间.如果一个人认为自己在网络形式上很好,我会建议MVP.如果在页面生命周期等事情上感觉不太舒服,MVC可能是一种方法.

这是另一个博客文章链接,提供了有关此主题的更多详细信息

http://blog.vuscode.com/malovicn/archive/2007/12/18/model-view-presenter-mvp-vs-model-view-controller-mvc.aspx


Ped*_*tos 9

我已经使用了MVP和MVC,虽然我们作为开发人员倾向于关注两种模式的技术差异,但恕我直言中MVP的要点与其他任何内容的易用性相关.

如果我在一个已经作为Web表单开发风格的良好背景的团队中工作,那么引入MVP要比MVC容易得多.我会说在这种情况下MVP是一个快速的胜利.

我的经验告诉我,将团队从Web表单转移到MVP然后从MVP转移到MVC相对容易; 从Web表单转移到MVC更加困难.

我在这里留下了我的朋友发表的关于MVP和MVC的一系列文章的链接.

http://www.qsoft.be/post/Building-the-MVP-StoreFront-Gutthrie-style.aspx


Jam*_*ter 8

在MVP中,视图从演示者绘制数据,该演示者从模型中绘制和准备/标准化数据,而在MVC中,控制器通过视图中的推入从模型中绘制数据并进行设置.

在MVP中,您可以使用单个视图处理多种类型的演示者,并使用单个演示者处理不同的多个视图.

MVP通常使用某种绑定框架,例如Microsoft WPF绑定框架或HTML5和Java的各种绑定框架.

在这些框架中,UI/HTML5/XAML知道每个UI元素显示的演示者的属性,因此当您将视图绑定到演示者时,视图会查找属性并知道如何从这些属性中绘制数据以及如何在用户在UI中更改值时设置它们.

因此,例如,如果模型是汽车,则演示者是某种汽车演示者,将汽车属性(年份,制造商,座位等)暴露给视图.该视图知道名为"car maker"的文本字段需要显示演示者Maker属性.

然后,您可以将视图绑定到许多不同类型的演示者,所有演员都必须具有制作者属性 - 它可以是飞机,火车或者任何视图都不关心的视图.视图从演示者中获取数据 - 无论哪个 - 只要它实现了一个商定的接口.

这个绑定框架,如果你剥离它,它实际上是控制器:-)

因此,您可以将MVP视为MVC的演变.

MVC很棒,但问题在于它通常是每个视图的控制器.控制器A知道如何设置视图A的字段.如果现在,您希望视图A显示模型B的数据,您需要控制器A知道模型B,或者您需要控制器A来接收带有接口的对象 - 这就像MVP只有没有绑定,或者您需要在Controller B中重写UI集代码.

结论 - MVP和MVC都是UI模式的解耦,但MVP通常使用一个绑定框架,它是下面的MVC.THUS MVP处于比MVC更高的架构级别和MVC之上的包装模式.


Mos*_*ael 8

MVC(模型-视图-控制器)

\n

在MVC中,控制器是负责人!控制器根据某些事件/请求被触发或访问,然后管理视图。

\n

MVC 中的视图实际上是无状态的,控制器负责选择要显示的视图。

\n

例如:当用户点击\xe2\x80\x9cShow MyProfile\xe2\x80\x9d按钮时,控制器被触发。它与模型通信以获取适当的数据。然后,它会显示一个类似于个人资料页面的新视图。控制器可以从模型中获取数据并将其直接提供给视图(如上图所示),或者让视图从模型本身获取数据。

\n

MVP(模型-视图-演示者)

\n

在 MVP 中,View 才是负责人!每个View都会调用它的Presenter或者有一些Presenter监听的事件。

\n

MVP 中的视图不实现任何逻辑,Presenter 负责实现所有逻辑并使用某种接口与视图进行通信。

\n

例如:当用户单击 \xe2\x80\x9cSave\xe2\x80\x9d 按钮时,View 中的事件处理程序委托给 Presenter\xe2\x80\x99s \xe2\x80\x9cOnSave\xe2\x80\x9d 方法。Presenter 将执行所需的逻辑以及与 Model 进行任何所需的通信,然后通过其接口回调 View,以便 View 可以显示保存已完成。

\n

MVC 与 MVP

\n
    \n
  • MVC 并不让 View 负责,View 充当 Controller 可以管理和指导的从属角色。
  • \n
  • 在 MVC 中,视图是无状态的,而 MVP 中的视图是有状态的并且可以随时间变化。
  • \n
  • 在 MVP 中,视图没有逻辑,我们应该尽可能让它们保持愚蠢。另一方面,MVC 中的视图可能具有某种逻辑。
  • \n
  • 在 MVP 中,Presenter 与 View 解耦,并通过接口与之对话。这允许在单元测试中模拟视图。
  • \n
  • 在 MVP 中,视图与模型完全隔离。然而,在 MVC 中,视图可以与模型进行通信,以使其保持最新的数据。
  • \n
\n

在此输入图像描述

\n


Hib*_*u57 6

我简陋的短视图:MVP适用于大尺度,而MVC适用于小尺度.对于MVC,我有时会觉得V和C可能被看作是单个不可分割组件的两个而不是直接绑定到M,并且当向下到较短的比例时,一个不可避免地会出现这种情况,比如UI控件和基本小部件.在这种粒度级别上,MVP毫无意义.相反,当一个人进入更大的规模时,适当的界面变得更加重要,同样明确的责任分配,这就是MVP.

另一方面,当平台特征有利于组件之间的某种关系时,拇指的这种缩放规则可能非常小,例如与Web相比,它似乎更容易实现MVC,而不是MVP.


onm*_*133 6

MVC有很多版本,这个答案是关于Smalltalk中原始的MVC。简而言之,就是 MVC 与 MVP 的对比图

droidcon NYC 2017 - Clean app design with Architecture Components 的演讲阐明了这一点

在此输入图像描述 在此输入图像描述

  • 在 MVC 中,模型永远不会直接从视图中调用 (6认同)
  • 这是一个不准确的答案。不要被误导。正如@rodi 所写,视图和模型之间没有交互。 (5认同)
  • @Jay1b 你认为什么 MVC 是“正确的”?这个答案是关于原始 MVC 的。还有许多其他 MVC(如 iOS 中的)已更改以适应平台,例如“UIKit” (3认同)

Cli*_*ies 5

最简单的答案是视图如何与模型交互。在 MVP 中,视图由演示者更新,演示者充当视图和模型之间的中介。演示者从视图中获取输入,视图从模型中检索数据,然后执行所需的任何业务逻辑,然后更新视图。在 MVC 中,模型直接更新视图,而不是通过控制器返回。

  • 看看维基百科上的 MVC,这就是它的工作原理。 (2认同)
  • 无论读者是否喜欢,通过谷歌搜索可以找到大量资料表明,在 MVC 中,视图订阅模型的更新。*并且*在某些情况下甚至可能*是*控制器,因此*调用*此类更新。如果您不喜欢这样,那么就去抱怨这些文章,或者引用您认为唯一合法来源的“圣经”,而不是对仅传递其他可用信息的答案投反对票! (2认同)

std*_*out 5

Uncle Bob有一段精彩的视频,他在最后简要解释了MVCMVP 。

在我看来,MVP 是 MVC 的改进版本,您基本上将要显示的内容(数据)与如何显示(视图)的关注点分开。演示者包括 UI 的业务逻辑,隐式地规定应该呈现哪些数据,并为您提供一个哑视图模型列表。当需要显示数据时,您只需将视图(可能包含相同的 id)插入适配器,并使用这些视图模型设置相关的视图字段,并引入最少量的代码(仅使用 setter)。它的主要好处是您可以针对许多/各种视图测试您的 UI 业务逻辑,例如在水平列表或垂直列表中显示项目。

在 MVC 中,我们通过接口(边界)来粘合不同的层。控制器是我们架构的插件,但它没有这样的限制来强加显示什么。从这个意义上说,MVP 是一种 MVC,其概念是视图可通过适配器插入控制器。

我希望这会有所帮助。

  • Bob 叔叔的重要观点:当 Trygve Reenskaug 最初发明时,MVC 是针对*每个小部件*而不是整个表单。 (3认同)

Jbo*_*aga 5

我认为 Erwin Vandervalk 的这张图片(以及随附的文章)是对 MVC、MVP 和 MVVM、它们的相似之处和不同之处的最佳解释。由于文章标题中没有包含“MVC”和“MVP”字样,因此该文章不会出现在搜索引擎结果中,用于查询“MVC、MVP 和 MVVM”;但我认为这是最好的解释。

解释 MVC、MVP 和 MVVM 的图像 - 作者 Erwin Vandervalk

这篇文章也与 Bob Martin 大叔在他的一次演讲中所说的一致:MVC 最初是为小的 UI 组件设计的,而不是为系统的架构设计的)