MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式。

软件中最核心的,最基本的东西是什么? 是的,是数据。我们写的所有代码,都是围绕数据的。

围绕着数据的产生、修改等变化,出现了业务逻辑。

围绕着数据的显示,出现了不同的界面技术。

没有很好设计的代码,常常就会出现数据层(持久层)和业务逻辑层还有界面代码耦合的情况。

ORM等框架,解耦合了业务逻辑和数据之间的耦合,业务逻辑不再关心底层数据如何存储和读取。所有数据呈现给业务逻辑层的就是一个个的对象。

而MVC, MVP, MMVM用来解决业务逻辑和视图之间的耦合。

一、MVC模式

MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(controller)的缩写。MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

Model

用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。

模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。

View

视图层负责数据的展示。

在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里订阅Model的事件。

Controller

控制器是M和V之间的连接器,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变。

MVC优点

•由于MVC很好的分离了视图层和业务层,所以它具有以下优点

•耦合性低

•开发速度快

•可维护性高

•没有控件的概念,对html没有封装,易于理解

•和其它平台(java, php)等更加相似。便于人才获取

二、MVP模式

MVP模式也是一种经典的界面模式。MVP中的M代表Model, V是View, P是Presenter。

在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的

View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用!

不仅如此,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试 —— 而不需要使用自动化的测试工具。

我们甚至可以在Model和View都没有完成时候,就可以通过编写Mock

Object(即实现了Model和View的接口,但没有具体的内容的)来测试Presenter的逻辑。

MVP的优势

•模型与视图完全分离,我们可以修改视图而不影响模型

•可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部

•我们可以将一个Presener用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。

•如果我们把逻辑放在Presenter中,那么我们就可以脱离用户界面来测试这些逻辑(单元测试)

三、MVVM模式

MVVM模式中,一个ViewModel和一个View匹配,它没有MVP中的IView接口,而是完全的和View绑定,所有View中的修改变化,都会自动更新到ViewModel中,同时ViewModel的任何变化也会自动同步到View上显示。

这种自动同步之所以能够的原因是ViewModel中的属性都实现了observable这样的接口,也就是说当使用属性的set的方法,都会同时触发属性修改的事件,使绑定的UI自动刷新。(在WPF中,这个observable接口是

INotifyPropertyChanged; 在knockoutjs中,是通过函数ko.observable()

和ko.observrableCollection()来实现的)

所以MVVM比MVP更升级一步,在MVP中,V是接口IView, 解决对于界面UI的耦合;

而MVVM干脆直接使用ViewModel和UI无缝结合, ViewModel直接就能代表UI.

但是MVVM做到这点是要依赖具体的平台和技术实现的,比如WPF和knockoutjs,

这也就是为什么ViewModel不需要实现接口的原因,因为对于具体平台和技术的依赖,本质上使用MVVM模式就是不能替换UI的使用平台的.

由于在winform中无法像WPF一样,支持数据和界面的双向绑定以及事件的监控,所以,在winform中MVP是最佳选择。

WPF和html界面中使用Knockout,实现了observable, 所以使用MVVM.(应该说WPF就是为使用MVVM设计的)

在web应用中,由于http是基于请求和响应方式协同工作的, 无法一直保持连接状态,所以无法达到MVP中Presenter之间的消息传递和MVVM中的ViewModel和界面之间的绑定, 所以MVC是最佳的选择。

mvc mvp mvvm比较以及区别相关推荐

  1. MVC, MVP, MVVM比较以及区别(下)

    上一篇得到大家的关注,非常感谢.一些朋友评论中,希望快点出下一篇.由于自己对于这些模式的理解也是有限,所以这一篇来得迟了一些.对于这些模式的比较,是结合自己的理解,一些地方不一定准确,但是只有亮出自己 ...

  2. MVC MVP MVVM原理和区别

    MVC是指Modle,View和Controller,将界面,业务逻辑和控制器分开,是一种低耦合的设计方式,适用于简单的应用开发. 这种设计模式最简单,但问题有三: (1).View和Model相互可 ...

  3. Android 系统(77)---MVC,MVP,MVVM的区别

    MVC,MVP,MVVM的区别 一.MVC 软件可以分为三部分 1.Model:模型层,负责处理数据的加载或者存储  2. View:视图层,负责界面数据的展示,与用户进行交互  3.Controll ...

  4. java mvc mvp mvvm_一篇文章了解架构模式:MVC/MVP/MVVM

    架构模式的文章很多,好理解的没有几个.大部分文章出现的主要问题有: 没有设定好作用域:前端MVC是改造过的MVC,和后台MVC有明显的区别,不能一概而论 没有实际的例子:实际的例子对应日常的工作,没有 ...

  5. Android中常见的MVC/MVP/MVVM模式

    Android中常见的MVC/MVP/MVVM模式 经典MVC 在1979年,经典MVC模式被提出. 在当时,人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来,而Trygve Re ...

  6. iOS-【转载】架构模式 - 简述 MVC, MVP, MVVM 和 VIPER

    看了很多篇关于 iOS 架构模式的,尤其是关于 MVVM 的,都是似懂非懂,无意看见了这篇,发现总结的很到位,很用心,特转载至此,如果英语好,请看原文 iOS Architecture Pattern ...

  7. iOS-【转载】架构模式 - 简述 MVC, MVP, MVVM 和 VIPER (译)

    看了很多篇关于 iOS 架构模式的,尤其是关于 MVVM 的,都是似懂非懂,无意看见了这篇,发现总结的很到位,很用心,特转载至此,如果英语好,请看原文 iOS Architecture Pattern ...

  8. iOS 架构模式 - 简述 MVC, MVP, MVVM

    Make everything as simple as possible, but not simpler - Albert Einstein,把每件事,做简单到极致,但又不过于简单 - 阿尔伯特· ...

  9. iOS 架构模式 - 简述 MVC, MVP, MVVM 和 VIPER (译)

    在使用 iOS 的 MVC 时候感觉怪怪的?想要尝试下 MVVM?之前听说过 VIPER,但是又纠结是不是值得去学? 继续阅读,你就会知道上面问题的答案 - 如果读完了还是不知道的话,欢迎留言评论. ...

最新文章

  1. 对输入框以及选择框集体的数据检验
  2. 转载:如何将一个新函数加到MATLAB函数库中
  3. 小程序----面试题总结
  4. 再见,Springboot和SpringCloud
  5. [html] 如何禁止html页面缓存?
  6. DIY 主机 所有AMD IntelCPU及主板
  7. SharePoint 2007部署过程详细图解(上)— 前期环境搭建
  8. window下python2和python3的共存
  9. Mblock使用时钟中断显示4段数码管的值
  10. C语言求 阶乘 5!
  11. 信息技术的分类方法有哪些?
  12. Blazor Web Assembly (WASM) 主题切换
  13. VB.NET 文本框获得焦点
  14. 每日学口语(持续更新)
  15. AH463全极高灵敏低功耗霍尔开关
  16. VIDEO GOOGLE
  17. 小米(红米)AC2100 硬路由配置的坑
  18. CodeForces #549 Div.2 D. The Beatles
  19. 【第57题】输入、输出系列5-文件锁定功能
  20. 自学编程80余年,这些私藏的实用工具学习网站陪我走到了现在,必须收藏,学习效率翻倍! - 工具篇

热门文章

  1. Android的评论功能的实现
  2. 判断对象是否为空工具类
  3. HAR(HTTP Archive)规范
  4. 1分36秒,100亿的背后,双11前支付宝工程师竟然要拜关公?
  5. blender源代码编译运行
  6. 痛惜,27岁名校博士生在答辩前夜跳崖自杀!
  7. 我不就是吃点肉,应该没事吧——爬取一座城市里的烤肉店数据(附完整Python爬虫代码)
  8. Zbrush to Mari 头部置换贴图制作 - 模型导入
  9. 编程题 模拟保皇游戏开始的发牌过程
  10. 百度惊雷算法横空出世