在Android实际项目中一般都会涉及到设计模式,Android中使用最多的设计模式就是:MVC,MVP,MVVM这三种。合理使用设计模式,会使代码思路更清晰,更易维护。
一,MVC模型简介
MVC的全名是 Model View Controller 即模型(model)— 视图(view)— 控制器(controller)
controller :Activity、Fragment
Model: 数据处理(数据获取,数据库等)
VIew: layout、VIew控件
使用MVC实现的需求 :
1,将数据的获取与界面的展示分离开来(将数据请求从Activity/Fragment中分离到Model中)
2,解决各层之间的通信问题(Activity通知Model去获取数据,Model通知Activity更新界面)
MVC优缺点 :
优点:一定程度上实现了Model与View的分离,降低了代码的耦合性。
缺点:Controller 与VIew 难以完全解耦,并且随着项目复杂度的提升,Controller将越来越臃肿(Activity即是控制器,又要承担部分视图层的工作)。
因为Controller 与VIew 难以完全解耦,所以有的模型图是这样:
二,MVP模型简介
MVP 即 Model - VIew - Presenter 模型
presenter: 连接View 和Model 的纽带
Model: 数据方面的工作
VIew: 视图方面的工作(activity/fragment)
MVP 和MVC 的差别
1,Model 与View 不再直接进行通信,而是通过中间层presenter来实现。
2,Activity的功能被简化,不再充当控制器,主要负责VIew层面的工作。
MVP简单的功能职责划分:
使用MVC实现的需求 :
1,MVPActivity 负责提供View层面的功能(采用接口的方式)
2,MVPModel 负责提供数据方面的功能
3,Model与VIew 不再直接通信,通过Presenter来实现
MVP优缺点:
优点:解决了MVC中Controller与VIew 过度耦合的缺点,职责划分明显,更加易于维护。
缺点:接口数量多,项目复杂度升高,随着项目复杂度的提升,Presenter层将越来越臃肿。
使用MVP的建议:
1,接口规范化(封装父类接口以减少接口的使用量)
2,使用第三方插件自动生成MVP代码
3,对于一些简单的界面,可以选择不使用框架
4,根据项目复杂程度,部分模块可以选择不使用接口(这里Presenter和Model没有使用接口形式,在实际项目中自行选择是否使用接口)
三,MVVM模型简介
MVVM是Model-VIew-ViewModel 的简写,MVVM在MVP的基础上实现了数据视图的绑定(Databinding),当数据变化时,视图会自动更新;反之,当视图发生变化是,数据也会自动更新。
首先简单介绍下DataBinding是什么?
Databinding 是谷歌官方发布的一个实现数据绑定的框架(实现数据与视图的双向绑定),datebinding可以帮助我们在安卓中更好的实现MVVM模式。
DataBinding使用步骤:
1,启用DateBinding
2, 修改布局文件为DataBinding布局
3,数据绑定
(具体使用方法查看官方文档)
MVP简单的功能职责划分:
使用MVVM实现需求
1,提供View,ViewModel以及Model三层
2,将布局修改为DataBinding布局
3,View与ViewModel之间通过DataBinding进行通信
4,获取数据并展示在界面上
要想完美的使用MVVM,就需要学会DataBinbing 和 LiveData,因为DataBinding是实现MVVM数据绑定的工具,LiveData可以更好的解决MVVM的通信问题,并且可以感知组件的生命周期,能够有效的避免内存泄漏。
LiveData + ViewModel
1,LiveDate是一个可以被观察的数据持有者,它可以通过添加观察者的方式来让其他组件观察的它的变更。
2,LiveDate遵从应用程序的生命周期(如果LiveData的观察者是已经销毁状态,Livedata就不会通知该观察者)。
MVVM优缺点:
优点:实现了数据和视图的双向绑定,极大的简化代码。
缺点:bug难以调试,并且DataBing目前还存在一些编译问题。
总结:
MVC:学习简单但是解耦不够彻底
MVP:解耦更加彻底,学习起来也相对比较简单,但是代码相对比较繁琐
MVVM:代码逻辑非常简洁,但是学习成本较大。
在实际项目中,要灵活运用设计模式,简单的项目可以不使用设计模式,或者使用MVC模式,复杂的项目可以用MVP或者MVVM。我们使用设计模式的初衷是代码简单易维护,不要为了使用设计模式而使用设计模式,还是应该怎么简单怎么来。