如果我们使用短语"What is difference between MVC, MVP & MVVM design pattern"搜索Google,那么我们可能会得到一些讨论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)看起来有何不同,那么请将我重定向到那篇文章 .
4 回答
This应该是一个好的首发 . 实际上,您选择的'platform'在如何使用这些模式方面也扮演了重要角色 . 例如,MVVM自然适合WPF,而MVP适用于Windows Forms . ASP.Net MVC不言而喻 .
一些基本的差异可以简写:
MVC:
传统的MVC就是有的
Model:充当数据模型
视图:处理可以作为UI的用户视图
Controller:控制Model和View之间的交互,其中视图调用控制器来更新模型 . 如果需要,View可以调用多个控制器 .
MVP:
与传统MVC类似,但Controller由Presenter取代 . 但与Pre不同,Presenter也负责更改视图 . 该视图通常不会调用演示者 .
MVVM
这里的不同之处在于View Model的存在 . 它是一种Observer Design Pattern的实现,其中模型中的更改也由VM表示在视图中 . 例如:如果更改了滑块,则不仅更新模型,而且还会更新视图中显示的可能是文本的数据 . 所以有一个双向数据绑定 .
MVC, MVP, MVVM
MVC(旧的)
MVP(由于其低耦合而更加模块化.Presenter是View和Model之间的中介)
MVVM(您已经在VM和UI组件之间进行了双向绑定,因此它比MVP更加自动化)
另一张图片:
从链接的伟大解释:http://geekswithblogs.net/dlussier/archive/2009/11/21/136454.aspx
Let's First look at MVC
输入首先指向Controller,而不是视图 . 该输入可能来自与页面交互的用户,但也可能只是将特定URL输入到浏览器中 . 在任何一种情况下,它都是一个与之连接的控制器,以启动一些功能 .
Controller和View之间存在多对一关系 . 这是因为单个控制器可以基于正在执行的操作选择要呈现的不同视图 .
从Controller到View有一种方向箭头 . 这是因为View对控制器没有任何了解或参考 .
Controller确实传回了模型,因此View和传递给它的预期模型之间存在知识,但不是控制器提供它 .
MVP – Model View Presenter
现在让我们来看看MVP模式 . 除了一些关键的区别外,它看起来与MVC非常相似:
输入以View开头,而不是Presenter .
View和关联的Presenter之间存在一对一映射 .
View包含对Presenter的引用 . Presenter也对从View触发的事件做出反应,因此它知道与之关联的View .
Presenter根据它在Model上执行的请求操作更新View,但View不支持Model .
MVVM – Model View View Model
因此,在我们面前的MVC和MVP模式中,让我们看一下MVVM模式,看看它有什么不同之处:
输入以View开头,而不是View Model .
虽然View包含对View Model的引用,但View Model没有关于View的信息 . 这就是为什么它可以在各种视图和一个视图模型之间进行一对多映射......甚至可以跨技术 . 例如,WPF视图和Silverlight视图可以共享相同的视图模型 .