网上现在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. threejs - uv 映射 简要

    啥也不说先上way+code+demo; https://github.com/Thinkia/threejs_/blob/master/test/test2-%20uv/readme.md 如何理解 ...

  2. 【重要】ionic和Angular的安装步骤

    首先搭建好npm和node环境的最新版本安装:: 一:开始安装ionic: 1. npm install -g ionic(全局安装ionic) 2. ionic start 新建的项目名称 +模板样 ...

  3. python web开发-flask中消息闪现flash的应用

    Flash中的消息闪现,在官方的解释是用来给用户做出反馈.不过实际上这个功能只是一个记录消息的方法,在某一个请求中记录消息,在下一个请求中获取消息,然后做相应的处理,也就是说flask只存在于两个相邻 ...

  4. 使用jitpack来获取github上的开源项目

    在开发中我们需要经常使用第三方依赖库,在构建工具Gradle或maven中声明依赖, 大部分使用的是maven中心仓库或者阿里云仓库等等,但是这样也存在一个问题,上述仓库的库虽然简单快捷好用,但并不是 ...

  5. Java CAS机制详解

    CAS目的: 在多线程中为了保持数据的准确性,避免多个线程同时操作某个变量,很多情况下利用关键字synchronized实现同步锁,使用synchronized关键字修可以使操作的线程排队等待运行,可 ...

  6. React 组件间通讯

    React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父 ...

  7. Cxf 自动生成客户端服务端代码

    第一步: 下载apache-cxf安装包.并安装. 第二步: 配置cxf的环境变量. CXF_HOME = "CXF安装路径". 例如:F:\apache-cxf-2.1.2 在P ...

  8. USB Audio设计与实现

    1 前言 本文将基于STM32F4 Discovery板,从零开始设计并实现一个USB Audio的例子. 2 设计构思 所谓的USB AUDIO就是制作一个盒子,这个盒子可以通过USB连接到PC,P ...

  9. linux No space left on device 由索引节点(inode)爆满引发500问题

    inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取 ...

  10. php 类接口继承练习

    <?php /** * @hypo 接口的特性:接口中定义的所有方法都必须是public 接口的实现:一个接口可以使用implements操作符,类中必须实现接口中的所有方法,否则会报fatal ...