iOS - MVC、MVP、MVVM

2022-07-14  本文已影响0人  搬砖的crystal

一、MVC

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

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

Controller 是同时持有 ViewModel 的。

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

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

二、MVP

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

MVP 模式是在 MVC 模式上衍生出了一个 Presenter 层

工作逻辑
  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 层

优点

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

缺点

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

三、MVVM

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

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 模式,代码量大大减少。

缺点

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

上一篇 下一篇

猜你喜欢

热点阅读