MVC模式
mvc(model-view-controller)


- model代表了数据模型
- view代表视图界面
- controller代表控制器,里面写逻辑处理
mvc模式的用处:把视图,逻辑,数据处理的代码分离,实现模块化管理,降低耦合性。
mvc的优点:简单易理解适合快速开发,具有一定分层。
mvc的缺点:
1.在安卓中view会直接从model中取数据从而使view依赖model,依据model操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
2.很多处理view的逻辑只能写在Activity中,导致Activity充当了View和Controller的角色,所以view和controller相当于没有解耦。
mvc的使用场景:
- 当屏幕上有一个单向动作时,我们可以使用MVC,用户的所有交互都会影响Model,但结果不会影响UI
- 当屏幕足够简单,使用MVC,但是它需要与我们的Model层进行通信
MVP模式
mvp(model—view-presenter)

mvp模式的用处:解决mvc的c层责任不明的问题。
mvp的优点:
1.降低耦合性,彻底解决了mvc中view和controller责任不明的问题。
2.让view实现可复用,可以将presenter用于多个视图,而不需要改变presenter的逻辑,另外也可以脱离presenter来测试视图。
mvp的缺点:
1.对于UI的输入和数据的变化,需要手动调用p层的接口,缺乏自动性和监听性
2.如果业务需求变大,p层就会存在大量接口,还是无法实现降低耦合性。
3.一旦v层某个ui元素更改,对应的接口也要更改,比如数据如何映射到ui上,事件监听接口都要改变
mvp使用场景:
- 当屏幕具有双向交流时,可以使用MVP,其中用户交互需要从模型层请求某些内容,并且此请求的结果将影响UI
- 当受模型层更新影响的UI元素非常有限时,可以使用MVP
MVVM模式
mvvm(model-view-viewmodel)

mvvm的出现是为了解决mvp缺乏自动性监听性的问题,mvvm新增了DataBinding的新特性,mvvm中的view和viewmodel通过DataBinding进行关联,DataBinding通过监听数据的变化直接反映到ui上。安卓实现DataBinding的技术有jetpack的livedata,observable等等,Flutter的则有状态管理模式比如说scope——model模式,bloC模式,provider模式,redux模式等等。
mvvm的优点:通过DataBinding解决mvp缺乏自动性监听性的问题,实现了代码耦合性更加降低(少了那些比如数据变化而要setText等代码,而只需要setdata)。
mvvm的缺点:对于一些状态比较少,视图比较少的项目,使用mvvm就太麻烦了
mvvm的使用场景:
- 当屏幕包含许多视图时,可以使用MVVM,此时,使每个视图更容易在View-Model中订阅数据源,并在数据源发生更改时自行处理它...数据源可以是Live-Data或Observable,也可以是所使用的框架
- 当屏幕具有单向流时,也可以使用MVVM,事件来自model,并且在没有任何用户交互的情况下影响UI,常见情况是地图app,屏幕会更新人在Map上的位置,无论何时位置更改时,地图都会更新。