最近看了一堆js框架的文档,有点乱,想分门别类整理一下,但是首先需要搞清楚这些框架里面经常谈论的MV*之类的概念。MVC的概念很早就知道,现在发现还有MVP、MVVM,那么这些设计模式有什么区别呢?谈一下自己的理解。

刚开始理解这些概念的时候认为这几种模式虽然都是要将view和model解耦,但是非此即彼,没有关系,一个应用只会用一种模式。后来慢慢发现世界绝对不是只有黑白两面,中间最大的一块其实是灰色地带,同样,这几种模式的边界并非那么明显,可能你在自己的应用中都会用到。实际上也根本没必要去纠结自己到底用的是MVC、MVP还是MVVP,不管黑猫白猫,捉住老鼠就是好猫。

MVC:Model-View-Controller
MVP:Model-View-Presenter
MVVM:Model-View-ViewModel
先说一下三者的共同点,也就是Model和View

  1. Model就是领域模型,数据对象,同时,提供外部对应用程序数据的操作的接口,也可能在数据变化时发出变更通知。Model不依赖于View的实现,只要外部程序调用Model的接口就能够实现对数据的增删改查。

  2. View就是UI层,提供对最终用户的交互操作功能,包括UI展现代码及一些相关的界面逻辑代码。

三者的差异在于如何粘合View和Model,实现用户的交互操作以及变更通知

  1. Controller接收View的操作事件,根据事件不同,或者调用Model的接口进行数据操作,或者进行View的跳转,从而也意味着一个Controller可以对应多个View。Controller对View的实现不太关心,只会被动地接收,Model的数据变更不通过Controller直接通知View,通常View采用观察者模式监听Model的变化。

  2. Presenter,与Controller一样,接收View的命令,对Model进行操作;与Controller不同的是Presenter会反作用于View,Model的变更通知首先被Presenter获得,然后Presenter再去更新View。一个Presenter只对应于一个View。根据Presenter和View对逻辑代码分担的程度不同,这种模式又有两种情况:Passive View和Supervisor Controller。

  3. ViewModel,注意这里的“Model”指的是View的Model,跟上面那个Model不是一回事。所谓View的Model就是包含View的一些数据属性和操作的这么一个东东,这种模式的关键技术就是数据绑定(data binding),View的变化会直接影响ViewModel,ViewModel的变化或者内容也会直接体现在View上。这种模式实际上是框架替应用开发者做了一些工作,开发者只需要较少的代码就能实现比较复杂的交互。

MVP和MVVM完全隔离了Model和View,但是在有些情况下,数据从Model到ViewModel或者Presenter的拷贝开销很大,可能也会结合MVC的方式,Model直接通知View进行变更。在实际的应用中很有可能你已经在不知不觉中将几种模式融合在一起,但是为了代码的可扩展、可测试性,必须做到模块的解耦,不相关的代码不要放在一起。记得几年前在上一家公司做一个新产品时,一名外包公司的新员工直接在View中做了数据库持久化操作,而且一个hibernate代码展开后发现竟然有几百行的SQL语句,搞得我们惊讶不已,一时成为笑谈。

个人理解,在广义地谈论MVC架构时,并非指本文中严格定义的MVC,而是指的MV*,也就是视图和模型的分离,只要一个框架提供了视图和模型分离的功能,我们就可以认为它是一个MVC框架。在开发深入之后,可以再体会用到的框架到底是MVC、MVP还是MVVM。

上面如有错误,敬请指出,谢谢。

本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/1773812,如需转载请自行联系原作者

对MVC、MVP、MVVM的理解相关推荐

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

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

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

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

  3. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    本文转载自https://www.tianmaying.com/tutorial/AndroidMVC,原文作者周鸿博. 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开 ...

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

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

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

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

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

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

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

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

  8. [iOS][转]iOS 架构模式 - 简述 MVC, MVP, MVVM 和 VIPER (译)

    转自: https://segmentfault.com/a/1190000004680605?ref=myread Make everything as simple as possible, bu ...

  9. MVC---Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    转载自: http://www.tianmaying.com/tutorial/AndroidMVC 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使 ...

  10. 表现层持续解耦带来的模式转变 MVC MVP MVVM

    ---微软WPF带来的团队变化和软件技术变化  Model-View-ViewModel是一种架构模式,主要在WPF.Silverlight和WP7开发里使用,它的目标是从视图层移除几乎所有代码隐藏( ...

最新文章

  1. html中如何修改href,在html中设置href链接中的变量
  2. python扫雷代码_室友扫雷通关来炫耀!我用Python做出自动扫雷十秒通关!
  3. qt 信号多个链接槽_Qt原理窥探信号槽的实现细节
  4. QT:基本知识(一);
  5. 《AI技术人才成长路线图》:完整版PPT及要点解读
  6. MSFT_NetAdapter修改网卡名
  7. iOS底层探索之多线程(十七)——通过 Swift的Foundation源码分析锁(NSLock、NSCondition、NSRecursiveLock)
  8. hashcat字典攻击
  9. 计算机修复开机按什么,电脑蓝屏修复按哪个健?
  10. 三种开源协议的选择:BSD,Apache,MIT
  11. 鼠标不能动怎么选择计算机,鼠标不动了怎么办解决方案
  12. 单片机开发之嵌入式基础
  13. Android:软键盘弹出配合界面效果脱坑
  14. 转帖:经济危机来临时的上海MM生活
  15. Bugku web — ereg正则%00截断(代码审计) ——详细题解
  16. Docker容器指定映射端口启动redis
  17. petalinux uboot源码怎么打补丁
  18. 华为datacom和RS对比有什么区别?
  19. GoshawkDB:一个分布式、支持事务与容错的对象存储
  20. 丁腈橡胶自然老化时间_丁腈橡胶老化与防护的探究

热门文章

  1. Customization larbin
  2. 图解web前端开发工具教程
  3. Android - Intentservice源码解析
  4. 力扣——按递增顺序显示卡牌
  5. Python 全栈开发:python字符串切片
  6. 20171101从现在开始就请有计划的学习吧!
  7. 封装运动框架多个属性
  8. 子选择器与后代选择器的区别
  9. csapp:无符号数可能造成的程序bug
  10. 用矩阵内积的办法构造迭代次数受控的神经网络1:0.6:0.1=4:3:2