Android开发笔记之MVC、MVP、MVVM

目录

一、前言

二、介绍

三、MVC框架模型

MVC模型简介

MVC模型优缺点 

四、MVP框架模型

MVP模型简介

MVP模型优缺点

使用MVP的建议

五、MVVM框架模型

DataBinding的基本用法

使用MVVM实现需求

使用MVVM实现需求-主要步骤

MVVM的优缺点

六、最终总结


 

未完正在更新中。。。。

 

一、前言

Android大型项目中,为了达到模块内部的高聚合和模块间的低耦合性,提高项目的可维护性和可扩展性,我们通常会使用一种框架模型,本篇文章主要带大家认识学习Android的MVC-MVP-MVVM三种框架模型。在文章中除了会对比介绍每个模型的优缺点,还会结合代码案例来解析每个模型的使用。

二、介绍

在Android开发中随着项目由简单到复杂的提升,我们的项目将会变的非常难以维护,为了解决这所带来的一系列问题,我们就需要学习一些android中常用的框架,那么android中常用的框架有三种:MVC、MVP、MVVM,学习android框架是非常有必要的,它在面试中也会经常被问到相关的技术点,同时学习框架可以帮助优化我们的代码、提高日常开发的效率,下面我们来依次讲解这三个常用框架,我们将会结合理论+代码的方式来介绍。

Android开发笔记之MVC、MVP、MVVM_第1张图片

三、MVC框架模型

本章通过具体事例对比使用MVC模型和不使用框架模型的区别,并使用MVC实现对该需求的优化,总结MVC的优点以及MVC中还可以进行优化的部分。下面我们将通过代码的方式,来讲解为什么要使用框架?为什么要学习MVC模式?

下面我们来看这么一个需求,查询用户账号信息

Android开发笔记之MVC、MVP、MVVM_第2张图片

我们先来看一下,这个需求最终实现的一个效果。失败-显示查询数据失败,成功-显示账号名称、账号等级

      Android开发笔记之MVC、MVP、MVVM_第3张图片   Android开发笔记之MVC、MVP、MVVM_第4张图片

对于这样一个需求,如果我们不使用任何框架去实现它,会遇到一个什么样的问题?不使用任何框架要实现这样一个需求,我们可以这样去写,我们可以创建一个NormalActivity,然后去实现如下这些功能

Android开发笔记之MVC、MVP、MVVM_第5张图片

下面我们来看看具体的代码实现

我们代码功能都实现了,我们会发现在NormalActivity中它承担的任务量是比较多的,比如说它既要获取查询账号数据、然后又要展示成功、失败界面的数据,还要实现成功、失败界面的业务逻辑处理等,如果一直这样写代码,当我们的项目越来越复杂、功能越来越多,那么NormalActivity里面的代码就会越来越臃肿、非常不好维护,要解决这样一个问题,我们可以使用mvc模式,mvc模式可以很好的对代码进行优化、解耦,将数据的获取和界面的展示分割开来。

MVC模型简介

我们来看一下mvc模型

下面这是一张mvc比较常见的模型图以及它在android中的映射对象

Android开发笔记之MVC、MVP、MVVM_第6张图片

其中上面的箭头代表事件的传递方向,比如点击一个view,事件就会传递到Activity也就是Controller当中,最后Controller再通知Model来进行数据的获取,Model再通知View来进行界面的一些展示工作。

事件的传递,比如说要从Controller传递到Model,我们可以直接让Controller持有Model的引用。Model要向View传递数据,我们一般不直接让Model持有View的引用,我们可以使用注册监听的方式来实现,如callback等。下面我们使用mvc模式对前面的代码进行一些优化处理

Android开发笔记之MVC、MVP、MVVM_第7张图片

这个是上面我们实现的一个需求,在NormalActivity中它负责了太多的功能,那么使用mvc模式我们需要对它进行一些优化,比如我们要把它的数据获取和界面展示进行分离。我们可以这样做,如下图

Android开发笔记之MVC、MVP、MVVM_第8张图片

我们把NormalActivity分为三层,使用MVCActivity来进行界面展示,使用MVCModel来进行数据的获取,View主要是一些布局文件等。我们会发现为了实现数据获取和界面展示的分离,我们把查询账号数据的功能移植到了Model中。我们需要实现以下操作

Android开发笔记之MVC、MVP、MVVM_第9张图片

下面我们来看看具体的代码实现

MVC模型优缺点 

Android开发笔记之MVC、MVP、MVVM_第10张图片

优点:一定程度上实现了Model与View的分离,降低了代码的耦合性,也方便了以后我们对代码的维护。

缺点:Controller与View难以完全解耦,并且随着项目复杂度的提升,Controller将越来越臃肿。

Controller一般是指我们android中的Activity或Fragment,所以对于mvc模型,有的模型图是这样的

Android开发笔记之MVC、MVP、MVVM_第11张图片

它是把View和Controller放在了一块,因为它们非常难以完全解耦,对于mvc的使用建议大家灵活使用,根据自身项目需求来定制属于自己的mvc模式。

四、MVP框架模型

本节将带大家总结MVC模型存在的问题,通过对比的方式学习MVP框架模型,并使用MVP模型实现对该需求的进一步优化,最后总结MVP的优点,以及MVP中还可以进行优化的部分。

前面我们讲到mvc模型,它有一些明显的缺陷

Android开发笔记之MVC、MVP、MVVM_第12张图片

而在mvp模型当中,这些问题得到很好的解决

MVP模型简介

Model主要负责数据方面的工作,View主要负责视图方面的工作,它主要指android当中的Activity或Fragment,而Presenter则是连接Model和View的一个纽带。

我们会发现图中Model和View已经不再发生直接的通信了,而是通过中间的Presenter层去实现,并且在mvp当中Activity或Fragment充当我们的view层,view层的功能也已经得到简化,主要负责视图方面的工作。

Android开发笔记之MVC、MVP、MVVM_第13张图片

下面我们来看下mvp与mvc的差别

Android开发笔记之MVC、MVP、MVVM_第14张图片

要使用mvp模型来实现需求,首先我们需要在View层来创建一个activity,然后在activity实现视图方面的功能:获取用户输入、展示成功界面、展示失败界面。为了方便解耦,我们还可以创建一个接口(IMVPView),然后将对应的视图功能放到接口当中去声明,最后让activity去实现我们的接口,这样activity也就拥有了对应的视图功能。

Android开发笔记之MVC、MVP、MVVM_第15张图片

接着,我们需要创建一个Model(MVPModel)来实现我们的数据功能(查询账号数据),需要提供查询账号数据,而Model和View之间是不进行任何通信的,所以我们还需要一个中间层Presenter(MVPPresenter),它可以进行业务逻辑处理,并且作为中间层它还需要负责Model和View之间的通信。那么怎么实现呢?我们可以让Presenter持有View以及Model的引用,这样就可以实现View与Model在Presenter层的一个间接的通信。

下面我们来总结一下,要使用mvp模型实现需求,我们需要实现如下主要步骤

Android开发笔记之MVC、MVP、MVVM_第16张图片

下面我们来看看具体的代码实现

MVP模型优缺点

Android开发笔记之MVC、MVP、MVVM_第17张图片

使用MVP的建议

Android开发笔记之MVC、MVP、MVVM_第18张图片

1、因为它的接口数量比较多,所以我们需要进行接口的规范化。比如我们可以封装父类接口以减少接口的使用量。

2、使用第三方插件来自动生成MVP的代码,这样可以减少工作量

3、对于一些简单的界面,可以选择不使用框架。或者选择使用mvc框架

4、根据项目的复杂程度,我们部分模块可以选择不使用接口。就像我们上面演示的代码,只对activity进行了接口的使用,Model层和Presenter层都没有使用接口。

五、MVVM框架模型

本节将带大家总结MVP框架模型存在的问题,通过对比的方式学习MVVM模型,并使用MVVM模型实现对该需求的再一步优化,最后总结MVVM的优缺点。

上面我们讲了mvp模型,mvp对mvc进行了比较好的优化,并且在日常的项目代码中,mvp已经能够帮助我们满足大部分的场景需求,但是它还不够简洁,需要使用较多的接口,所以我们希望可以对它进行进一步的优化。下面我们来看看mvvm框架模型

Android开发笔记之MVC、MVP、MVVM_第19张图片

首先我们会发现mvvm的模型图和mvp的模型图是非常相似的,唯一的区别就是将Presenter替换成了ViewModel,实际上确实是这样的,mvvm和mvp在思想上是非常接近的,但是在代码逻辑上mvvm会显得更加的简洁。下面我们就具体来看一下mvvm,

Android开发笔记之MVC、MVP、MVVM_第20张图片

 mvvm相对于mvp减少了接口数量,并且因为使用了数据绑定DataBinding,所以mvvm可以告别繁琐的findViewByid的操作。因此在进一步学习mvvm之前,我们需要先学习下DataBinding。

DataBinding的基本用法

DataBinding是什么?

Android开发笔记之MVC、MVP、MVVM_第21张图片

也就是说DataBinding是实现mvvm模式的一个工具,用来提供数据绑定服务,要在我们的项目中实现DataBinding,我们需要做到以下三步

Android开发笔记之MVC、MVP、MVVM_第22张图片

第一步,启用DataBinding,也就是让我们的项目支持DataBinding

第二步,修改布局文件为DataBinding布局,也就是把传统的布局文件修改为DataBinding布局

第三步,进行数据绑定

 

在app的build.gradle里面,添加语句启用DataBinding

android {
    
    ......

    //启用DataBinding
    dataBinding{
        enabled = true;
    }

}

 

选中最外层的布局标识,按住 alt + enter 键,就会提示我们讲传统布局转换为DataBinding布局 (Convert to data binding layout)

 

当布局转换为DataBinding布局以后,系统会我们自动生成这样一个类ActivityDemoBinding

 

使用MVVM实现需求

上面我们学习了DataBinding的基本用法,接下来我们继续MVVM模型的代码实战部分

Android开发笔记之MVC、MVP、MVVM_第23张图片

使用MVVM实现需求,我们还是需要三层:Model层(M)、View层(V)、ViewModel层(VM)

View层:主要负责视图相关的功能,主要代表的还是Activity以及layout布局文件

Model层:主要负责数据的获取

ViewModel层:作为中间纽带层,实现一些业务逻辑相关的功能,并且在MVVM模型中ViewModel层还需要负责数据更新,以保证当数据发生变化的时候,视图可以得到及时的更新。

总体来说MVVM和MVP是非常相似的,不同的是在MVVM中使用DataBinding进行了数据的绑定,所以View层的主要负责人,就从Activity变为了layout,layout的功能变得非常的强大,可以在布局文件中直接使用数据 ,很多的功能我们也可以直接放到layout中去实现,这样就大大的简化了Activity里面的功能实现,可能Activity只需帮我们做一些初始化的工作。

还有一点不同的是在MVVM模型中,View与ViewModel使用DataBinding进行通信,比如我们可以在布局文件中声明ViewModel,这样就能在布局文件中直接引用ViewModel中的数据,这样做也可以简化ViewModel中的功能,一部分的逻辑可以放到布局文件中去实现。

使用MVVM实现需求-主要步骤

首先,我们需要在代码中提供 View、ViewModel以及Model三层

第二步,将布局文件修改为DataBinding布局

第三步,需要实现View与ViewModel之间通过DataBinding进行通信

第四步,获取数据并展示在界面上

Android开发笔记之MVC、MVP、MVVM_第24张图片

但是有时候有些功能我们需要放到Activity中去做,这样就会出现一个问题,比如我们在Activity中当点击按钮的时候,我们需要做一些申请权限的操作,那么这个时候ViewModel如何通知Activity去做这件事情呢?我们可以让ViewModel持有Activity的引用,或者说是借用第三方库比如EventBus等,但是这样做都不是非常好,对于MVVM模型我们还是建议:LiveData+ ViewModel的方式去实现,为什么要使用LiveData呢?

Android开发笔记之MVC、MVP、MVVM_第25张图片

所以对于MVVM模式要想使用的好,需要学习的东西还是挺多的。

MVVM的优缺点

优点:相对于MVP,MVVM实现了数据和视图的双向绑定,极大的简化了我们的代码。

缺点:bug难以调试,并且dataBinding目前还存在一些编译的问题。

所以大家要慎重选择判断,要想使用好MVVM,我们可以把DataBinding和LiveData先学好,因为DataBinding是实现MVVM模式数据绑定的工具,LiveData可以更好的解决MVVM模式之间的通信问题,并且它可以感知组件的生命周期,能够有效的避免内存泄露问题。

Android开发笔记之MVC、MVP、MVVM_第26张图片

六、最终总结

上面我们讲了mvc、mvp、mvvm模式并且进行了代码实战,总体来说各有各的优势,下面我们来总结一下 

mvc:学习简单但是解耦不够彻底。

mvp:解耦更加彻底,学习起来也相对比较简单,但是代码相对比较繁琐,因为需要声明比较多的接口。

mvvm:代码逻辑非常简洁,但是学习成本较大。

至于如何选择大家需要根据自己的项目,选择适合自己项目的框架,我们需要灵活变通,比如有些界面或项目比较简单,我们就可以不使用框架或者使用mvc框架。项目如果比较复杂需要频繁的进行维护,我们可以考虑使用MVP或MVVM模型框架。同时对于框架的使用,建议大家多使用一些第三方插件,可以一键生成代码减少重复的工作量,或者说是自定义插件定制自己需要的代码。

Android开发笔记之MVC、MVP、MVVM_第27张图片

 

 

感谢-参考学习链接:

https://www.imooc.com/learn/1177

 

 

你可能感兴趣的:(安卓开发)