网上现在MVC、MVP以及MVVM的讲解一搜一箩筐,根据了网上大多数的文章,根据我的思考习惯进行了总结。

  MVC介绍及分析:

  

  各层的职责如下所示:

  Models: 数据层,负责数据的处理和获取的数据接口层。

  Views: 展示层(GUI),对于 iOS 来说所有以 UI 开头的类基本都属于这层,界面元素搭建,动画效果,数据展示。

  Controller: 控制器层,它是 Model 和 View 之间的胶水或者说是中间人。一般来说,当用户对 View 有操作时它负责去修改相应 Model;当 Model 的值发生变化时它负责去更新对应 View,响应View的事件和作为view的代理,处理view的生命周期以及处理界面之间的跳转。

  三者是完全独立分开的,view和model是完全隔离的,而controller作为二者的中间人负责二者的交互,以保证复用性,但是因为controller是作为特定的场景存在的,多以很难服用,这也是MVVM和MVP产生的原因。

  
  先说MVC:
  想要做到上述这样是很难的,因为一个界面的呈现是需要构建一个UIViewController的,但是每一个UIViewController都带有一个view,这就导致了controller和view一起耦合在了ViewController里面。iOS里面的viewcontroller其实是view和controller的组合,目的就是为了提高开发效率,简化操作。viewcontroller确实应付简单页面没啥问题,认为真正的MVC就是这么干的,导致很多新手都把本来view层的代码都堆到了VC,比如在VC里面构建view、view的显示逻辑,甚至在VC里面发起网络请求。
  对于model层的误解:
  model层的正确定义是业务模型,而不是只有几个干巴巴的属性,也就是你所有业务数据和业务实现逻辑都应该定义在M层里面,而且业务逻辑的实现和定义应该和具体的界面无关,也就是和视图以及控制之间没有任何的关系,它是可以独立存在的。其实这里面涉及到一个最基本的设计原则,那就是面向对象的基本设计原则。类应该是一个个具有不同操作和不同属性的对象的抽象(类是属性和方法的集合),供C层调用的都是M层里面一个个业务类所提供的成员方法来实现。
  总结来说:M层不应该是数据模型,放几个属性就完事了。而应该是承载业务逻辑和数据存储获取的职责一层。
 
  正确构建MVC:viewcontroller不是C层,而是V和C两层的混合体。
  为了给VC减负,我们现在把VC只当做一个view的容器来使用,因为UIViewController其中有一个self.view,所有的界面上的view都需要addSubview来添加,所以此时的UIViewController的职责就是
  1、生成子view并添加到自己的self.view上面
  2、管理view的生命周期
  3、通知每个子Controller去获取数据
 
  MVC优点:
  1、代码复用: 三个小模块的V(cell/userInfoView)对外只暴露Set方法, 对M甚至C都是隔离状态, 复用完全没有问题
  2、代码臃肿: 因为Scene大部分的逻辑和布局都转移到了相应的MVC中
  3、易拓展性: 需要的只是新建相应的MVC模块, 加到对应的UIViewController即可.
  4、可维护性:修改模块,不需要更改其他的地方
  MVC最大的缺点:controller的代码没法复用

  C层的功能还有哪些了

  1、作为View和Model的中介者,从model获取数据,经过数据加工,渲染到view上面显示

  2、响应view的点击事件,然后执行相应的业务逻辑  

  3、作为view的代理和数据源

  4、暴露接口给UIviewController来驱动自己获取数据

  这也就造成了有一些model和view强耦合,有些业务逻辑(页面跳转/点赞/分享…)是直接散落在V层的,因为业务逻辑最终改变的是数据M, 我们的关注点应该在M上, 而不是展示M的V。

  而MVP正是为了解决这一问题而诞生的,而MVVM是在MVP基础上发展起来的。

  MVVM也就是model、View 和 ViewModel;其中视图模型(ViewModel)其实就是 MVP 模式中的P,在 MVVM 中叫做VM。在 MVVM 的实现中,还引入了隐式的一个 Binder层,这也是MVVM相对MVP的进步,而声明式的数据和命令的绑定在 MVVM 模式中就是通过binder层来完成的。MVVM和MVP相对于MVC最大的改进在于:P或者VM创建了一个视图的抽象,将视图中的状态和行为抽离出来形成一个新的抽象已达到复用的目的。

  MVP的想法就是通过对view的事件处理,调用p的逻辑,时间执行成功后,p改变model的书籍,然后破获掉view的代理干煸view的显示,但是时间多起来的话就很麻烦,这就是MVVM的binder机制,让view的行为和状态和p的行为状态同步。

MVC、MVP以及MVVM分析的更多相关文章

  1. MVC MVP 和 MVVM的图示

    一直对于这些什么MVC MVP 和 MVVM都是云里雾里的 完全分不清楚 感觉jq上也没怎么用过,理解也很片面,画几张图也许能够大体分清他们之间的区别. 1.MVC(Model-View-Contro ...

  2. [转载]Android MVC,MVP和MVVM 思想&例子

    在Android开发中,常采用 MVC(Model-View-Controller)或者MVP(Model-View-Presenter) 等框架模式.设计如图   mvc mvp 可以看出,在 MV ...

  3. MVC, MVP, MVVM比较以及区别(上)

    MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...

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

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

  5. MVC, MVP, MVVM比较以及区别

    MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...

  6. [转]从三层架构到MVC,MVP

    本来是不想跳出来充大头蒜的,但最近发现园子里关于MVC的文章和讨论之风越刮越烈,其中有些朋友的观点并不是我所欣赏和推荐的,同时最近也在忙着给公司里的同事做MVC方面的“扫盲工作”.所以就搜集了一些大家 ...

  7. android MVC && MVP && MVVM分析和对比

    相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...

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

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  9. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...

随机推荐

  1. 为什么会有可恶的腾讯电脑管家&怎么干掉它-电脑开机出现腾讯电脑管家-无法卸载腾讯电脑管家

    为什么会有可恶的腾讯电脑管家 怎么干掉它 电脑开机出现腾讯电脑管家 无法卸载腾讯电脑管家 某天,趁空闲,升级了一些常用软件,其中就升了新版电脑qq,晚上玩完电脑后关机睡觉,第二天早上开机.出现了图一: ...

  2. 常用到的html页面布局和组件: 自己用

    1. 用div当作圆 <div style="border: 1px solid blue;height: 100px; width: 100px; border-radius: 20 ...

  3. Mycat 分片规则详解--ASCII 取模范围分片

    实现方式:该算法与取模范围算法类似,该算法支持数值.符号.字母取模.首先截取长度为 prefixLength 的子串,在对子串中每一个字符的 ASCII 码求和,然后对求和值进行取模运算(sum%pa ...

  4. 笔记:Spring Cloud Ribbon RestTemplate 详解

    详细介绍RestTemplate 针对几种不同请求类型和参数类型的服务调用实现,示例代码中的 restTemplate 都是通过Spring 注入方式创建的,相关代码如下: @Autowired pr ...

  5. ElasticSearch的安装

    一.安装javaSE环境(已配java环境变量的请直接跳过) 1.从Java JDK 官网下载适合自己的jdk版本.(我自己用的jdk1.7) 2.安装jdk后,配置java环境变量(ps:比较喜欢简 ...

  6. xilinx和altera复位电平

    xilinx使用高电平复位 altera使用低电平复位 原因:Xilinx 寄存器的SR控制端是高电平有效的.如果RTL代码采用了低电平有效的复位模式,综合器将在复位信号驱动寄存器SR控制端之前的插入 ...

  7. php数组排序和查找的算法

    1.php算法 // 算法 // 1.冒泡排序 => 思路:​每次循环排列出一个最大的数 // echo '<pre>'; $arr = [ 1,43,54,62,21,66,32, ...

  8. react的基本使用,及常用填坑

    import React, { Component } from 'react'; import PropTypes from 'prop-types'; import './First.css'; ...

  9. Bate敏捷冲刺每日报告--day4

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...

  10. python 闭包计算移动均值及nonlocal的使用

    class Averager1(): '''计算移动平均值的类第一种写法''' def __init__(self): self.series = [] def __call__(self,new_v ...