前言

  • 1,MVC、MVVM、MVP都属于框架模式

    • 框架是对软件进行分工,设计模式是对具体问题提出的解决方案,两者有本质的区别
  • 2.MVC模式是面向开发最常用的模式,同时也是最经典的模式

    • 其他的模式还有MTV、MVP、CBD、ORM等等很多
  • 3.所有的其他模式MVVM或者MVP都是在MVC的基础上建立的

    • MVC模式是任何模式的根源,有万变不离其宗之理
  • 4.一个项目并不是只有一个MVC和一个MVVM,而可能是每一个功能每一个界面都对应了一个MVC

    • 所以一个完整的项目是由很多个MVC和MVVM或者MVP组成的
  • 5.目前网络上的水军很多,有很多人混了一年半载开发经验,然后看了一两篇文章就觉得MVC怎么怎么不好,有说MVVM模式多么多么牛逼的,也有说MVP模式多么多么牛逼的

    • 其实这也反映了市场上很多人对框架模式的一知半解的态度

      • 笔者认为,任何一款软件都是在面对不同的功能时针对这几种模式之间有一个良好的权衡,而不是一位的偏袒某一种模式

思考题1:应用软件是由什么组成的?

  • 由展示视图的和对于的逻辑代码组成的

    • 视图对应的就是View层,逻辑代码对于的就是Model层

思考题2:视图和模型之间是直接进行交互的吗?

  • 视图和模型之间并不直接进行交互,而是通过控制器(controller)的协调来进行交互

    • 这就是MVC模式的组成结构:视图(View)、控制器(Controller)、模型(Model)

1.1-MVC模式

  • 实例:当用户点击一个按钮,请求网络数据,然后刷新当前taleview

    • 1.首先c层获取用户的点击按钮事件,然后向M层发送指令请求数据

      • 注意:此时M层请求的数据并不是直接丢给界面的tableview,而是将对象的模型M传递给C层

        • M层是通过代理来传递给C层的(网络请求类的代理或者block回调)
    • 2.C层获取到M层返回的网络数据之后,直接在C层给V层(tableview)发送刷新的指令reloadData

    • 3.当V层(tableview)想要告知C层我已经准备开始刷新了,你给我数据吧,是通过代理和数据源方法来告知的

  • MVC模式的核心就是定义了视图(view)、控制器(controller),数据(model)之间各行其道不能越界的职责

    • 可以联想到交通规则中的实线不能便道,虚线可以变道的规则
  • MVC模式的优点(由于MVC很好的分离了视图层和业务层,所以它具有以下优点)

    • 耦合度低
    • 开发速度快
    • 可维护性高
  • MVC模式的缺点

    • 由于一味地强调每一个层级之间的严格关系,当MVC三者之间,当C层需要处理的逻辑很多或者V层界面展示非常复杂的时候,就会导致某一个View文件或者Controller文件代码非常的多,甚至有四五千行代码的时候,我们维护起来就非常的麻烦。

1.2-MVVM模式

  • 此处有笔误,应该是MVVM模式下是将C层拆分成M层和V层,也就是常说的ViewModel

  • MVVM模式产生的由来就是当MVC模式下的C层代码量很多的时候将其拆分成M层和C层

    • 比如说父子控制器可以理解成是MVVM模式
    • ViewModel也是一种MVVM模式的体现,ViewModel本身是一个对象,它的内部维护了视图和视图对应的逻辑
  • MVVM模式的本质就是对MVC模式进行一个拆分,解决了MVC模式下代码臃肿的问题

  • MVVC模式的优点

    • 可复用性比MVC模式高(拆分的V和M可以被其他的mvc或者mvvm复用)
    • 耦合度低
  • MVVM模式缺点

    • 项目文件增多

1.3-MVP模式

  • MVP模式的定义

    • 作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

      • *也就是说,如果MVC模式中V不能直接访问M,就和MVP无异
  • 关于MVP模式误区的解读

    • MVP模式主要是解决MVC模式下V可以直接访问M导致耦合度很高的问题,但是根据网易公开课斯坦福大学教授的说法,MVC模式中V和M本来就是不能够进行交互的

      • 所以MVP模式的诞生个人认为是一个笑话,是对MVC模式理解的不够深刻所导致的
  • 以下是网易公开课斯坦福大学教授Paul Hegarty(世界知名级教授)讲解MVC模式的示意图

  • 视频链接http://open.163.com/special/opencourse/ios8.html

1.4-框架模式的总结

  • 所有的MVC或者MVVM模式的目的都是为了代码的解耦和易读性,MVC之间的沟通本质上还是OC的对象间消息机制的使用,以下是oc中的三种消息机制

    • 代理
    • 通知
    • kvo
  • 什么时候使用MVC,什么时候使用MVVM,这主要是由具体的业务需求所决定的

    • 业务需求很简单,控制器代码量不复杂(低于两千行代码),优先考虑MVC
    • 业务需求比较复杂,控制器代码量很多(高于两千行)或者V和M的复用性极高,可以考虑MVVM

MVC和MVVM以及MVP的介绍相关推荐

  1. mvvm绑定checkbox wpf_C#框架结构分层:三层结构,DDD,MVC,MVVM,MVP

    本文主题,讲解主要有哪些分层思想. 一.三层结构 作为早期程序开发的经典,这是一个完全由程序员自己控制的分层思想. 在我们自己所有的项目中,几乎是无处不在,无时无刻不在使用. 它的主要思想是分界面层( ...

  2. MVC、MVVM、MVP

    MVC: V为view,是视图层,负责显示数据:M是model,负责管理及拉取数据:C是controller,是view和model层之间的枢纽,负责响应操作,当view需要数据,通知model拉取, ...

  3. MVC和MVVM框架介绍

    一.MVC框架(后端的分层开发概念): MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业 ...

  4. Swift黑科技:还在争论MVC和MVVM?博主独创幽灵架构MV!

    本人原创,长文慎入,但此文可能会改写你的编程风格.我认为数据和模型交互的关键问题是如何处理数据源和视图源本身的异构性.通过面向协议编程的不断实践,总结他人的理论经验,我发现了使用两个极简的通用协议可以 ...

  5. React 可视化开发工具 Shadow Widget 非正经入门(之四:flux、mvc、mvvm)

    本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 在 MVC.MVVM.Flux 框架之间如何做选择. 1. React Flux 框架 ...

  6. 前端mvc与mvvm

    框架与库的最大区别就是代码的风格确认,库只是页面级别的选择,而架构则关注于整个程序的设计 MVC 作为软件中的99口诀,软件设计要是没个mvc就好像不是正规军一样,前端也是这样,将html理解为vie ...

  7. 架构模式:MVC与MVVM

    本文探讨如下几个问题: 什么是MVC 什么是MVVM MVC与MVVM对架构属性的影响 MVC实例SpringMVC MVVM实例Vue MVC.MVVM与Layer中的Model,Controlle ...

  8. 探索从 MVC 到 MVVM + Flux 架构模式的转变

    在业务中一般 MVVM 框架一般都会配合上数据状态库(redux, mobx 等)一起使用,本文会通过一个小 demo 来讲述为什么会引人数据状态库. 从 MVC 到 MVVM 模式说起 传统 MVC ...

  9. 什么是Vue.js?||为什么要学习流行框架||框架和库的区别?||MVC和MVVM的关系图解

    什么是Vue.js? Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于W ...

最新文章

  1. Heartbeat+DRBD+NFS案例详解
  2. Can't call rollback when autocommit=true
  3. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
  4. CCHP分布式能源技术在数据中心IDC的应用
  5. mysql8.0限制用户只能访问指定数据库,限制用户只有某种权限
  6. VTK:多数据点用法实战
  7. 【转】JNI学习积累之一 ---- 常用函数大全
  8. vsflexgrid单元格换行后自动使用行高_Excel表格不会换行?10个超实用Excel小技巧,用了都说好!...
  9. SSO 中间件 kisso
  10. 我做的第二个正则转换工具
  11. python编写的购物网站_写一个购物商城的实例教程
  12. 六张图了解Python的赋值、浅复制、深复制
  13. php 网络爬虫,爬一下花瓣的图片
  14. JAVA实训心得体会(精选4篇)
  15. 面试中遇到的java笔试题
  16. python,PyQt5编程将qrc文件转为py文件
  17. win10 动态磁盘 linux,win10 动态磁盘 无效,win10动态磁盘不能识别
  18. Unicode 字符编码表|汉字Unicode编码的区间为:0x4E00→0x9FA5(转)
  19. linux tc限制网卡速度,使用TC 对LINUX服务器网卡进行带宽限制的办法
  20. 《第二行代码》学习笔记

热门文章

  1. python concat去除重复值语句_Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)...
  2. java 计算器 junit测试_Java中Junit4测试实例
  3. abaqus切削为什么没有切屑_SiCp/Al复合材料超声振动辅助切削研究现状与进展
  4. 记录处理搜狗新闻分类
  5. sklearn特征的提取(下)
  6. 结合随机微分方程,多大Duvenaud团队提出无限深度贝叶斯神经网络
  7. 刷完EMNLP 2021论文列表,我们挑出了这8篇预训练相关必读论文
  8. PyPy为什么能让Python比C还快?一文了解内在机制
  9. WWW 2021 | 通过强化学习控制对话式检索的风险
  10. ACL 2020 | 用于链接预测的开放知识图谱嵌入