MVC,MVP和MV之间有什么区别?编码c#的MVVM设计模式

时间:2013-10-18 07:55:49

标签: c# design-patterns model-view-controller mvvm mvp

如果我们使用短语&#34搜索Google; MVC,MVP和& E之间有什么区别? MVVM设计模式"那么我们可能会得到几个讨论the difference between MVC MVP & MVVM design pattern theoretically like的网址:

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)的代码看起来有何不同的任何此类文章,那么请将我重定向到该文章。

6 个答案:

答案 0 :(得分:86)

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

<强> MVC:

传统的MVC就是

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

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

    <强> MVVM

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

答案 1 :(得分:56)

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

答案 2 :(得分:32)

链接上的精彩解释:http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx

让我们先来看看MVC

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

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

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

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

MVP - 模型视图演示者

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

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

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

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

Presenter根据它在模型上执行的请求操作更新视图,但视图不支持模型。

MVVM - 模型视图视图模型

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

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

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

答案 3 :(得分:28)

MVC,MVP,MVVM

MVC(旧的)

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

MVVM(您已经在VM和UI组件之间建立了双向绑定,因此它比MVP更加自动化) enter image description here

另一张图片: enter image description here

答案 4 :(得分:1)

下图来自Erwin van der Valk撰写的this post

image explaining MVC, MVP and MVVM - by Erwin Vandervalk

article解释了不同之处,并提供了一些C#代码示例

答案 5 :(得分:0)

MVP:

优势:

Presenter将出现在模型和视图之间。Presenter将从模型中获取数据,并根据视图的需要对数据进行操作,并将其提供给视图,而视图仅负责渲染。

缺点:

1)我们不能将presenter用于多个模块,因为一个视图类会根据需要在presenter中修改数据。

3)突破了干净的体系结构,因为数据流应该仅是向外的,但是这里的数据是从演示者返回到View的。

MVC:

优势:

这里在视图和模型之间有Controller。这里数据请求将由Controller到View进行,但是数据将以接口的形式发送回View,而不是与Controller一起发送。因此,Controller不会变得肿因为有很多交易。

缺点:

数据操作应由View根据需要完成,这将是UI线程上的额外工作,如果进行更多的数据处理,可能会影响UI呈现。

MVVM:

在宣布了架构组件之后,我们可以访问ViewModel,它为我们提供了最大的优势,即它具有生命周期感知。因此,如果视图不可用,它将不会通知数据。这是一个干净的体系结构,因为流程仅处于前向模式,并且数据将由LiveData自动通知。因此,这是Android的推荐架构。

即使MVVM也有缺点。由于它是生命周期感知的,因此警报或提醒之类的某些概念应放在应用程序外部。因此,在这种情况下,我们不能使用MVVM。