Android的设计框架MVC、MVP和MVVM简单分析

622 阅读3分钟

架构设计的目的

通过设计使程序模块化,使模块内部高内聚和模块之间低耦合。提高程序开发效率,容易后续测试定位问题维护。切忌为了设计而设计,为了架构而架构。

当一个App代码量10W以上,需要复杂操作。一个文件超过5千行代码了。需要开发之间同步配合,就需要架构思考了。

MVC(Model View Controller)设计架构

image.png

View接受用户交互请求,View将请求转交给Controller,Controller操作Model进行数据更新,数据更新后Model通知View更新数据变化; 缺点:随着项目增大,Activity/Fragment臃肿。适合功能少,业务逻辑简单,界面不复杂的小型项目。

MVP设计架构

模型(Model):处理数据加载和存储(网络或本地数据库); 视图(View):负责界面数据展示,与用户进行交互; 主持人(Presenter):协调者,模型与视图之间的桥梁,将模型和视图分开。

image.png

View接收用户交互请求;View将请求转交给Presenter;Presenter操作Model进行数据更新;Model通知Presenter数据变化;Presenter更新View数据。

优点:Model与View完全分离,修改互不影响;Model层封装服用,可以极大减少代码量。一个Presenter可以用于多个View,而不需要改变Presenter的逻辑(View总是变化频繁的);便于测试,路基放在Presenter脱离用户接口来测试逻辑(单元测试);

缺点:随着业务逻辑增加,一个页面可能会非常复杂,UI的改变是非常多,造成View接口很庞大,Presenter层的代码也会臃肿。

适应场景:对于业务很复杂的大型App,过多的Model,View,Presenter,就会造成视觉疲劳,不利于维护和管理;对于业务简单小型APP来说,开发成本变高。MVP适合不大也不小的项目。

MVVM设计框架

是MVP改进,解决MVP的不足。MVVM将View的状态和行为抽象化,让视图UI和业务逻辑分开。

  • 模型层(Model):负责从各个数据源获取数据
  • 视图层(View):对应于Activity和Fragment,展示给用户和处理用户交互,驱动ViewModel从Model中获取数据;
  • ViewModel层:将Model和View进行关联,View通过ViewModel从Model获取数据;获取数据后自动绑定,将结果刷新到新的界面上。可以使用官方LiveData、DataBinding去实现MVVM架构。例如DataBinding架构组建会把ViewModel绑定到XML文件中,保证View中的数值来源都是来自ViewModel,降低布局和逻辑的耦合性。 View接收用户交互请求;View将请求转交给ViewModel;ViewModel操作Model数据更新;Model更新完数据,通知ViewModel数据发生变化;ViewModel更新View数据。

image.png

低耦合,课重用性,独立开发,课测试。

缺点:bug不好找;过大的项目,数据绑定会导致内存开销大;简单项目,MVVM过度设计了。

适用场景:对于复杂页面,对ViewModel构建和维护成本变高。不适用于简单的界面和过度复杂的界面。

MVC--〉MVP--〉MVVM

MVP中View并不直接使用Model,通过Presenter来进行,所有交互都发生在Presenter内部,MVC中View直接从Model中读取数据而不是Controller。

设计框架只是提供一个规范,具体用哪种框架其实无所谓,看适合哪种。哪种更好建立统一的规范。