网上现在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. 2017/11/25 2D变换

    2D变换 一.盒模型解析模式 1.box-sizing:盒模型解析模式 1)content-box:标准盒模型(和css2一样的计算) 宽度和高度之外绘制元素的内边距和边框 width,height外 ...

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

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

  3. Maven-07: 插件的自定义绑定

    除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能让Maven项目在构建过程中执行更多更富特色的任务. 一个常见的例子是创建项目的源码jar包.内置的插 ...

  4. Mycat 安装与启动

    环境准备 安装JDK1.8(必须JDK1.7及更高版本) 安装MySQL 服务安装与说明 下载 MyCAT 编译好的安装包,下载地址为 http://dl.mycat.io/1.6-RELEASE/ ...

  5. Java Arrays 源码 笔记

    Arrays.java是Java中用来操作数组的类.使用这个工具类可以减少平常很多的工作量.了解其实现,可以避免一些错误的用法. 它提供的操作包括: 排序 sort 查找 binarySearch() ...

  6. ClickOnce清单签名取消后依然读取证书的问题

    在 http://www.cnblogs.com/heroius/p/8270004.html 和 http://www.cnblogs.com/heroius/p/8278796.html中,通过编 ...

  7. Android Studio设置字体和主题

    步骤:File >> settings >> Appearance & Behavior >> Appearance           >> ...

  8. 【Linux】 字符串和文本处理工具 grep & sed & awk

    Linux字符串&文本处理工具 因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要.这篇介绍三个常用的字符串处理工具,包括grep,sed和awk ■ grep ...

  9. shiro权限框架(四)

    4.1授权方式 Shiro 支持三种方式的授权 编程式:通过写 if/else 授权代码块完成: Subject = SecurityUtils.getSubject(); if(subject.ha ...

  10. [luogu1402]酒店之王_网络流

    酒店之王 luogu-1402 题目大意:有n个人,p道菜,q个房间,每个人喜欢吃一些菜.喜欢住一些房间,如果一个人即住到了他喜欢的房间有吃到了他喜欢的菜,就对答案贡献++,求最大贡献. 注释:1&l ...