就编码C#而言,MVC,MVP和MVVM设计模式之间有何区别?


202

如果我们使用短语“ MVC,MVP和MVVM设计模式之间的区别是什么”来搜索Google,那么我们可能会获得很少的URL,这些URL会从理论上像MVC MVP和MVVM设计模式之间的区别进行讨论:

最有价值球员

在无法通过数据上下文进行绑定的情况下使用。Windows窗体就是一个很好的例子。为了将视图与模型分开,需要演示者。由于视图不能直接绑定到演示者,因此必须通过接口(IView)将信息传递给视图。

MVVM

在可以通过数据上下文进行绑定的情况下使用。为什么?删除了每个视图的各种IView接口,这意味着需要维护的代码更少。可能使用MVVM的一些示例包括使用Knockout的WPF和javascript项目。

MVC

在视图和程序其余部分之间的连接始终不可用(并且您无法有效地使用MVVM或MVP)的情况下使用。这清楚地描述了Web API与发送到客户端浏览器的数据分离的情况。微软的ASP.NET MVC是管理此类情况的绝佳工具,并提供了非常清晰的MVC框架


但是我还没有找到一篇文章在理论上与示例代码一起讨论差异。

如果我得到一篇讨论这三种设计模式(MVC,MVP和MVVM)与代码之间差异的文章,那将是非常不错的。

我想了解这3种设计模式(MVC,MVP和MVVM)实现的3个类似CRUD应用程序的源代码。这样我就可以遍历代码并了解如何为这三种设计模式(MVC,MVP和MVVM)编写代码。

因此,如果存在任何讨论这三种设计模式(MVC,MVP和MVVM)的代码外观不同的文章,那么请重定向至该文章。


14
在TechEd 2011中,有关于这3种模式的很好但简单的演示。演讲者使用C#和Visual Studio在相同的业务模型上制作并显示了示例。这是Channel9 MVC,MVP和MVVM中
Marco Medrano 2014年

2
这是文章:realm.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android。IMO编写得很好且清晰。它还有一个Github存储库,每个模式都有一个分支。
cuddlecheek

Answers:


100

可以简写一些基本区别:

MVC:

传统的MVC是

  1. 模型:充当数据模型
  2. 视图:处理可以作为UI的用户视图
  3. 控制器:控制模型和视图之间的交互,其中视图调用控制器来更新模型。如果需要,View可以调用多个控制器。

MVP:

与传统MVC相似,但Controller被Presenter取代。但是,与Controller不同,Presenter也负责更改视图。该视图通常不调用演示者。

MVVM

这里的区别在于视图模型的存在。它是Observer Design Pattern的一种实现,其中,VM也在视图中表示模型的更改。例如:如果更改了滑块,则不仅会更新模型,还会更新视图中显示的可能是文本的数据。因此,存在双向数据绑定。


1
小细节-您可以选择是两种方式的数据绑定,也可以定义一种方式的绑定。
Jviaches

10
“视图通常不调用演示者”?您能详细解释一下这句话吗?如果ui视图不会打电话给要去的主持人?
阿米尔·齐亚拉蒂

3
@AmirZiarati主持人密切关注事件。在发生事件的情况下,演示者可以发挥作用并采取必要的措施。
Pritam Banerjee

是的,只要它具有参考视图即可。我弄错了我以为您的意思是,视图起初甚至不需要呼叫演示者,但至少应该调用一次。谢谢;)
Amir Ziarati 2016年

1
@PritamBanerjee,从解释来看,MVP和MVVM几乎具有相同的功能。P或VM更新两个M&V.
马诺哈尔·雷迪Poreddy

42

MVC,MVP,MVVM

MVC(旧的)

MVP(由于耦合性较低,因此更具模块化。Presenter是View和Model之间的中介)

MVVM(您已经在VM和UI组件之间建立了双向绑定,因此比MVP自动化得多) 在此处输入图片说明

另一张图片: 在此处输入图片说明


24
请不要只是复制图像-特别是当它们彼此之间不一致时。请参见MVC(您没有看到的旧版本)浏览器,以顶部视图进行对话,而以下部视图与控制器对话。
peter.fr 17-10-18

1
@UddhavGautam其位令人困惑,因为第一个图像将View作为入口点,第二个图像将Controller示为。
everlasto

1
在第一个图中,MVVM和MVP有什么区别?正如我所看到的,它只是V和VM / P之间的链接。在一种情况下,将来回消息作为双向链接,而在另一种情况下,将它们表示为两个单向链接。我看不出它们之间的功能差异。我想念什么?
iCyber​​Paul

1
浏览器是指您与应用程序之间进行交互的用户。
Uddhav Gautam

4
剧情转折:没人真正知道发生了什么。它们实际上都是同一件事。哈哈。不,实际上,即使有了这些“有用的”图像,也很难处理到底发生了什么。我认为这是问题/困惑的一部分。
安德鲁

34

链接的出色解释:http : //geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

让我们先来看一下MVC

输入首先指向控制器,而不是视图。该输入可能来自与页面交互的用户,但也可能来自简单地在浏览器中输入特定的URL。在任何一种情况下,它都是与Controller相连以启动某些功能的控制器。

控制器和视图之间存在多对一关系。这是因为单个控制器可以根据正在执行的操作选择要渲染的不同视图。

从控制器到视图只有一种箭头。这是因为视图不了解控制器或对该控制器没有任何参考。

Controller确实会传回模型,因此在视图和传递给它的预期模型之间有知识,但Controller没有提供知识。

MVP –模型视图演示者

现在让我们看一下MVP模式。除了一些主要区别外,它看起来与MVC非常相似:

输入从“视图”而不是“演示者”开始。

视图和关联的演示者之间存在一对一的映射。

视图包含对演示者的引用。演示者还对从视图触发的事件做出反应,因此它知道与之关联的视图。

演示者根据其在模型上执行的请求操作来更新视图,但是视图不支持模型。

MVVM –模型视图视图模型

因此,有了我们面前的MVC和MVP模式,让我们看一下MVVM模式,看看它具有什么区别:

输入从视图开始,而不是从视图模型开始。

视图包含对视图模型的引用时,视图模型没有有关视图的信息。这就是为什么可以在各种视图和一个视图模型之间甚至在跨技术之间进行一对多映射的原因。例如,WPF视图和Silverlight视图可以共享同一视图模型。


7
“这是因为视图没有到控制器的任何知识或参考”这是不正确的
亚当沃尔斯基

@AmirZiarati ViewModel不是MVP的一部分,而是MVVM模式。

如果您提供示例,例如我们可以在哪里使用这些模式,我会很好
JKA

3

下图来自Erwin van der Valk撰写的文章

解释MVC,MVP和MVVM的图像-Erwin Vandervalk

文章解释了差异,并给出在C#中一些代码示例


上面的图像并不令人困惑,因为在MVC中,为什么VIEW直接访问Model?其他人也一样吗
smkrn110

在这些图中,不清楚箭头的含义。箭头是访问还是操纵?在MVC图,目前还不清楚为什么会出现没有箭头从模型开始
Pontios
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.