MVC MVP MVVM MVI 架构

以前一直觉得,写软件就是写功能,只要把应该有的功能写完,其他无所谓。直到写的软件越来越大,越来越复杂,工程内的文件杂七杂八堆在一起,看得眼睛累。过了一段时间忘了最初写代码时的想法,维护起来也很麻烦。这个时候意识到了软件架构的重要性。
软件架构的确有个发展顺序,但并不是越新越“好”。他们有着各自的优缺点,选择适合自己项目的架构。

  1. MVC
  2. MVP
  3. MVVM
  4. MVI

#MVC

Model:操作,处理软件用到的数据。

View:用户界面,在安卓里可以是页面布局文件。

Controller:操作 Model 获取/处理数据。

View 提供界面,是用户看见的部分,用户操作 Controller,Controller 操作 Model 获取数据,然后数据被传递到 View,展示给用户。

在 MVC 中,Model 获得数据后,通知 View 去更新数据。View 既是展示页面,又要处理展示的数据,耦合度高。理想情况中,View 层只做展示,这样就要把处理数据的功能拿出去,给 Controller 层,因为 Controller 多了向 View 层提供数据的功能,改名叫 Presenter 以示区分。这就是 MVP 架构。

#MVP

Model:操作,处理数据。

View:用户界面。

Presenter:操作 Model 处理数据,获得数据提供给 View。

MVP 是很好的架构,很多项目都在使用 MVP 架构。但是因为 Presenter 做为 View 和 Model 中间的桥梁,沟通两边,工作量很大,逻辑非常负载,当 View 交互多时,就会有非常多接口,写起来麻烦。因此,对 Presenter 层继续改动,改为 ViewModel 层。就得到了 MVVM 架构。MVVM 与 MVP 的区别是,将 View 与 Model 进行了绑定,这样 View 需要更新数据时,就不需要很多的接口,因为和 Model 绑定了。听起来有些“邪乎”,实际目的就是去除 Presenter 层太多的接口,Model 获得数据后,可以直接影响到 View。

#MVVM

Model:操作,处理数据。

View:用户界面。

ViewModel:将 View 与 Model 进行双向绑定(这就是ViewModel名字的由来)。

MVVM 看起来很好,理论上简化了接口。但是实际中,交互少时,用 MVVM 给人一种大材小用的感觉:用 MVP 也没有太多的“额外”工作;交互多时,因为引入 DataBinding,内存开销很大。继续针对数据做改动,出现了 MVI。

#MVI

Model:操作,处理数据。

View:用户界面。

Intent:并不是 Activity 中的 Intent,而一种新的用户操作封装。

MVI 是在 JavaScript 前端的启发下诞生的(Redux),关于 MVI 的文档很多,我这种菜鸟看的云里雾里。大概意思就是,加入了状态信息,继续并且控制数据,严格控制数据流动,数据只能单向流动。

纸上得来终觉浅,绝知此事要躬行。理解了,要写个 Demo,不理解的地方,写一遍代码就明白意思了。