iOS MVC、MVP、MVVM

MVC模式

MVC模式,即Model-View-Controller。它是苹果公司官方推荐的 App 开发架构,也是一般开发者最先遇到、最经典的架构。 图下所示的是 MVC架构的示意图。


image.png

上图持有关系为Controller是同时持有ViewModel的;

  1. View发生交互事件时,会通过action通知到ControllerController收到之后会去更新Model层的数据
  2. Model层的数据发生变化时,也会通知Controller层,之后会去更新View
  3. 可以看出,View层跟Model层之间的通信都是依赖Controller层的,Controller层相当于中介者,同时协调着View层跟Model层。

那么,在MVC模式下,App的组成可以分为三部分

  1. Model层:负责数据的持久化存储以及读取操作
  2. View层:负责视图数据的展示和交互
  3. Controller层:充当中介者,负责连接model层和view层。它将数据从model层传递到view层,同时将view层的交互传递到model层从而改变模型存储的数据。

优点

  1. 代码总量少。基本上,MVC大量的逻辑和视图代码都集中在ViewController层Model层只是实现简单的数据存储,View层主要负责视图数据的展示和交互。
  2. 简单易懂。MVC的设计模式可以让开发者很容易熟悉以及上手。

缺点

MVC的缺点也很明显,大量的代码都集中在了Controller层

  1. 代码过于集中。ViewController层集合了视图的交互、视图的更新、布局、Model数据的获取以及更新、网络请求等业务逻辑等大量的代码。
  2. 难以进行测试。大量的代码都堆积在了ViewController层,高度耦合难以测试。
  3. Model层过于简单。相比ViewController的庞大代码,Model 层只是定义几个属性在 Objective-C 的.m 实现文件中,更是几乎看不到代码。
  4. 网络请求逻辑无从安放。网络层放在 Model中,网络请求一般是异步调用的,那如果网络请求的周期比Model对象的生命周期还要长,那么就会使Model层的逻辑变得很复杂,若是将网络层放在ViewController中,则耦合进一步加剧,以上缺点更会被放大。

MVP

MVP模式的提出旨在解决MVC模式下Controller层过于臃肿的问题,那么在MVP模式下,会将Controller层的处理视图交互、发起网络请求更新Model数据以及更新视图View等一部分的业务逻辑抽离出来,减轻了Controller层的负担。

MVP的示意图如下:


image.png

从图中可以看出:
MVP模式是在MVC模式上衍生出了一个Presenter层,以及更新了不同层之间的持有关系。

  • View层以及Controller层持有Presenter层
  • Presenter层持有Model层

每层的分工

  1. View层:这里的View层是包含View以及Controller的。主要负责视图的布局以及一部分的视图交互。
  2. Model层:依然是负责数据的持久化存储以及读取。
    3.Presenter层:负责接收来自View层的交互,并更新数据到Model层,当Model层数据变更时,负责通知View层更新视图。

根据不同层之间的持有关系,我们可以推断出MVP模式的工作逻辑:

  1. View层Controller层都持有presenter层,而视图交互逻辑主要在presenter层,那么内部实现应该是View层将视图交互通知到presenter层,但是本身View层创建出的视图是被addSubViewController层的根视图的,所以Controller层又会持有View层,那么另一种实现可以是:Controller层作为View层的代理,View层将处理视图交互的操作定义在协议里,将交互事件传递给Controller层,而Controller层本身持有presenter层,那么就调用presenter层实现的对于视图交互的方法。
  2. 要注意的是,Controller层始终是核心层,它负责对于各个层主要的连接以及管理。

简单理一下用户交互的事件传递流程:
用户点击View视图 -> View视图触发交互事件 -> 交互事件传递代理Controller层 -> Controller层调用Presenter层实现好的交互操作 -> 发起网络请求更新持有的model数据 ->model层更新完毕之后通过代理或者通知到Presenter层 -> Presenter层再通过代理或通知通知到Controller层或者View层
具体的MVP设计实例

优点

  1. 相比于MVC,减轻了Controller层的负担,耦合度大大降低

缺点

view的所有交互都要传给Presenter处理,从而一旦功能增加了,View的代码和Presenter的代码都会增加,相比于MVC在ViewController一个文件里面直接解决,MVP的总代码量可能会翻倍,这样App的维护成本和文件都会增大。因此在MVC的基础上又衍生出了一种新的模式MVVM。

MVVM

MVVM模式是基于MVC模式的,在MVC的基础上分离出业务处理的逻辑到ViewModel层,即


MVVM.png
MVP.png

MVVM设计模式的示意图其实跟MVP的很相似,第二张图是MVP设计模式的示意图。
可以发现

  • View层View Model层之间是双向的,但这不是相互持有的关系,这是一种类似于通知的方法,当View的数据发生变化会自动通知到View Model,当View Model的数据发生变化,也会自动通知到View,所以总的来说,MVVM模式就是在MVP模式上新增了双向绑定。
  • 目前主流的双向绑定方案主要有RAC以及KVO
  • View/Controller 持有 View ModelView Model持有Model,那说明View Model的职责在于分担Controller层的视图交互、网络请求、更新Model模型数据等的业务逻辑。
  • 尽管在MVVM模式下,没有明确指出Controller层的指责划分,但是我们仍然是将Controller层充当Manager的身份,管理各个层以及将业务逻辑分配到View Model层。

我们再来看一下MVP模式下的业务逻辑


image.png

而在MVVM模式下,P层通知V层数据发生改变就不需要定义协议或者通知了,根据KVO或则RAC实现绑定,当一方数据发生变化即会通知到另一方.

优点

相比于MVP模式,代码量大大减少。

缺点

利用RAC实现双向绑定需要引入第三方响应式框架,而且因为属性观察环环相扣,调用栈变大,Debug起来会比较痛苦。

如有错误,欢迎指出👦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容