网上现在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. MYSQL汇总

    一.1.1 MYSQL 一.1.1.1 基础特性 1)性能卓越,服务稳定,很少出现异常宕机: 2)开放源代码且无版权制约,自主性强,使用成本低: 3)历史悠久,社区及用户非常活跃,遇到问题,可快速获得 ...

  2. 针对微信的一篇推送附有的数据链接进行MapReduce统计

    原推送引用:https://mp.weixin.qq.com/s/3qQqN6qzQ3a8_Au2qfZnVg 版权归原作者所有,如有侵权请及时联系本人,见谅! 原文采用Excel进行统计数据,这里采 ...

  3. web前端加载优化-减少HTTP请求 (细节与办法)

    减少HTTP请求. 因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个.a) 合并CSS.JavaScr ...

  4. three.js 实现全景以及优化(2)

    继昨天全景实现后,再做了一个全景图切换实验; code:https://github.com/Thinkia/threejs_/blob/master/test/test1-panorama/inde ...

  5. linux 下后台运行python脚本

    这两天要在服务器端一直运行一个Python脚本,当然就想到了在命令后面加&符号 $ python /data/python/server.py >python.log &说明:  ...

  6. CentOS7.2下Nginx的使用

    Nginx的启动 指定配置文件的方式启动 nginx -c /etc/nginx/nginx.conf 对于yum安装的nginx,使用systemctl命令启动 systemctl start ng ...

  7. MYSQL数据库学习五 表的操作和约束

    5.1 表的基本概念 表示包含数据库中所有数据的数据库对象.一行代表唯一的记录,一列代表记录的一个字段. 列(Columns):属性列,创建表时必须指定列名和数据类型. 索引(Indexes):根据指 ...

  8. 使用属性升级MyBank

    一.访问修饰符  private   :使用private访问修饰符修饰的属性或者方法只能在本类中使用 public    :可以在任何类中访问到 二.this 关键字:代表当前类,this.属性:代 ...

  9. class 选择器

    class 选择器 1.class 选择器用于描述一组元素的样式,class 选择器有别于id选择器,class可以在多个元素中使用. 2.class 选择器在HTML元素中以class属性(即cla ...

  10. C程序第二次作业

    2-1删除字符串中数字字符 1.设计思路 (1)主要描述题目算法 第一步:遍历指针s所指的s数组. 第二步:如果 * (s+i)在0至9之间的话,则跳过此 * (s+i). 第三步:如果* (s+i) ...