在编码c#方面,MVC,MVP和MVVM设计模式有什么区别?

Tho*_*mas 188 c# model-view-controller mvp design-patterns mvvm

如果我们使用短语"MVC,MVP和MVVM设计模式之间有什么区别"来搜索Google,那么我们可能会得到一些URL ,它们在理论上讨论了MVC MVP和MVVM设计模式之间的区别:

MVP

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

MVVM

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

MVC

用于视图与程序其余部分之间的连接并不总是可用的情况(并且您无法有效地使用MVVM或MVP).这清楚地描述了Web API与发送到客户端浏览器的数据分离的情况.Microsoft的ASP.NET MVC是一个管理这种情况的好工具,并提供了一个非常清晰的MVC框架


但我没有找到一篇文章,从理论上和示例代码讨论差异.

如果我得到一篇文章讨论这3种设计模式(MVC,MVP和MVVM)与代码之间的区别,那将是非常好的.

我想了解3个类似的CRUD应用程序的源代码,这些应用程序已经通过这三种设计模式(MVC,MVP和MVVM)实现.这样我就可以浏览代码并理解应该如何为这三种设计模式(MVC,MVP和MVVM)编写代码.

因此,如果存在任何此类文章讨论代码对于这3种设计模式(MVC,MVP和MVVM)的外观有何不同,那么请将我重定向到该文章.

Pri*_*jee 92

一些基本的差异可以简写:

MVC:

传统的MVC就是有的

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

MVP:

与传统MVC类似,但Controller由Presenter取代.但是,与Controller不同,Presenter也负责更改视图.视图通常不会调用演示者.

MVVM

这里的不同之处在于View Model的存在.它是Observer Design Pattern的一种实现,其中模型中的更改也由VM表示在视图中.例如:如果更改了滑块,则不仅更新模型,而且还会更新视图中显示的可能是文本的数据.所以有一个双向数据绑定.

  • "视图通常不会调用演示者"?你能解释一下这句话吗?如果你认为不会打电话给主持人谁会去? (8认同)
  • @AmirZiarati主持人密切关注这些事件.如果发生事件,演示者将发挥作用并采取必要的行动. (3认同)
  • 小细节 - 您可以选择是否是双向数据绑定,也可以定义单向数据绑定。 (2认同)

Dav*_*rne 62

应该是一个很好的首发.实际上,您选择的"平台"在如何使用这些模式方面也发挥着重要作用.例如,MVVM自然适合WPF,而MVP适用于Windows Forms.ASP.Net MVC不言而喻.

  • 太棒了!应该注意的是,福勒并没有使用"MVVM"作为术语 - 他提到了"演示模型".在链接的文章中,演示模型仅在传递中涵盖. (3认同)
  • 我认为这个答案过分依赖于它提供的链接.如果链接腐烂,这篇文章将提供一些有用的信息,这就是为什么我认为其他答案更好地解决这个问题. (2认同)

Udd*_*tam 35

MVC,MVP,MVVM

MVC(旧的)

MVP(由于其低耦合而更加模块化.Presenter是View和Model之间的中介)

MVVM(您已经在VM和UI组件之间进行了双向绑定,因此它比MVP更加自动化) 在此输入图像描述

另一张图片: 在此输入图像描述

  • 请不要只复制图像 - 特别是当它们彼此不一致时.在顶部图片中看到MVC(你没看到的旧的)浏览器会话,但是在下图中与控制器对话. (16认同)
  • 情节转折:没有人真正知道发生了什么。它们实际上都是同一件事。哈哈。不,但实际上,即使有了这些“有用”的图像,也很难理解到底发生了什么。我认为这是问题/混乱的一部分。 (5认同)
  • @UddhavGautam 这有点令人困惑,因为第一个图像将视图显示为入口点,第二个图像显示控制器。 (2认同)

小智 32

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

我们先来看一下MVC

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

Controller和View之间存在多对一关系.这是因为单个控制器可以基于正在执行的操作选择要呈现的不同视图.

从Controller到View有一种方向箭头.这是因为View对控制器没有任何了解或参考.

Controller确实传回了Model,因此View和传递给它的预期模型之间存在知识,但是不是Controller提供它.

MVP - 模型视图演示者

现在让我们来看看MVP模式.除了一些关键的区别外,它看起来与MVC非常相似:

输入以View开头,而不是Presenter.

View与关联的Presenter之间存在一对一映射.

View包含对Presenter的引用.Presenter也对从View触发的事件做出反应,因此它知道与之关联的View.

Presenter根据它在Model上执行的请求操作更新View,但View不支持Model.

MVVM - 模型视图视图模型

因此,在我们面前的MVC和MVP模式中,让我们看一下MVVM模式,看看它有什么不同之处:

输入以View开头,而不是View Model.

虽然View包含对View Model的引用,但View Model没有关于View的信息.这就是为什么它可以在各种视图和一个视图模型之间进行一对多映射...甚至跨技术.例如,WPF视图和Silverlight视图可以共享相同的视图模型.

  • "这是因为View对控制器没有任何了解或参考"这不是真的 (7认同)