本文会介绍Android开发中的架构,以及演进过程,包括MVC、MVP、MVVM、MVI。

什么是架构:
1.为了解决特定的问题而提出的;
2.按照特定的原则,将系统整体进行模块、组件、角色的划分;
3.建立模块、组件、角色间的沟通机制;

MVC:

MVC需要解决的问题是:控制逻辑、数据处理逻辑和界面交互耦合。
Model模型,负责数据的加载和存储。如网络请求、数据库处理;
View视图,负责界面的展示;
Controller控制器,负责逻辑控制;

优点:
结构清晰,职责划分清晰;
降低耦合;
有利于组件重用;

缺点:
Android实际开发中,通常Activity/Fragment会承担View和Controller两个角色的工作,导致里面代码过多;
Model直接操作View,View的修改会导致Controller和Model都进行改动;
增加类代码结构的复杂性;

MVP:


MVP是在MVC的基础上,将View和Model解耦。
Presenter:负责处理表现逻辑;

优点:
同MVC;
将MVC中的View和Model解耦;

缺点:
View和Presenter是双向依赖的,一旦View层做出改变,相应地Presenter页需要做出调整;
内存泄漏风险:Presenter持有View层的引用,当用户关闭类View层,但Model层仍然在进行耗时操作,就会有内存泄漏风险;
协议接口类膨胀:View层和Presenter层的交互需要定义接口方法,当交互非常复杂时,需要定义很多接口方法和回调方法,不利于维护;

MVVM:


MVVM是在MVP的基础上,将Presenter和View解耦。
ViewModel:存储视图状态,负责处理表现逻辑,并将数据设置给可观察数据容器。
实现细节上,View和Presenter从双向依赖变成View可以向ViewModel发指令,但ViewModel不会直接向View回调,而是让View通过观察者的模式去监听数据的变化,有效规避类MVP双向依赖的缺点。

缺点:
多数据流:View与ViewModel的交互分散,缺少唯一修改源,不易追踪;
LiveData膨胀:复杂的页面需要定义多个MutableLiveData,并且都需要暴露为不可变的LiveData。

DataBinding、ViewModel和LiveData等组件,是Google为了帮助实现MVVM而提供的架构组件,他们并不是MVVM的本质,只是实现上的工具;

MVI:
MVI是在MVVM的基础上,将View和ViewModel之间的多数据流改为基于ViewState的单数据流。
Intent:定义数据操作,是将数据传到Model的唯一来源;
ViewState:一个数据类,包含页面状态和对应的数据;

实现细节上,View和ViewModel之间的多个交互(多LiveData数据流)变成类单数据流。无论View有多少个视图状态,只需要订阅一个ViewState便可以获取所有状态,再根据ViewState去响应。

https://juejin.cn/post/7022624191723601928