我是robotking-Guetrobot,欢迎大家在评论区指出文中的不足之处,或者联系QQ:529169501
引言:在Android开发的过程中,我们往往会选择一种设计模式,mvp或者是mvc等等,mvp也是最近一两年十分流行的一个整体的项目分布架构,今天我们就先来说说我对mvc的一个理解,以及在使用mvc架构的时候如何进行分包和分类的管理;
1. mvc模式简介
mvc设计模式中的m代表模型层,v代表视图层,c代表控制层,但是在Android中部分的开发者在项目的实际开发过程中对mvc的真正运用其实是有一些偏差的,在android中我们可以将xml布局文件看成是我们的v视图层,而model是负责网络数据的加载和数据的提供,c控制层是负责控制数据加载和视图展示,mvc与mvp主要区别在于mvc中m和v层之间是可以相互直接的交互,而mvp中的mv是不能直接交互的,需要通过p层来交互,如图所示;
2.Android中mvc的包管理
2.1 初级开发项目常见的分包管理
这种分包结构是大部分的初级开发人员都会经历的一种包管理的方式,完全没有层级结构,业务、界面,逻辑都耦合在一起,如果在多人开发的过程中往往会出现各种问题,我们可以把这种分包模式称之为按照层级分包Package By Layer,简称PBL分包模式;按class职能分层(PBL)降低了代码耦合,但带来了package耦合,要添新功能,需要改model、dbHelper、view、service等等,需要改动好几个package下的代码,改动的地方越多,越容易产生新问题;
2.2 我对mvc分包管理的理解和具体项目的实现
由于部分开发者都使用Activity或者Fragment来作为控制层,而且大部分的业务逻辑都写在Activity里面,这就导致Activity特别的臃肿,维护十分困难,接下来我来说一下我使用mvc的一个分包格式,当然其实这种以分包来进行类管理的基本还是比较适合小型的项目,比较大的或者是门户型的应用建议使用组件化或者是插件化来进行具体的实现,如图2-2;
如图所示的分包结构,我们可以称这种分包模式为PBF(按功能分包Package By Feature)与小部分的PBL相结合的方式,那么我们首先来说一下PBF相比较于PBL的分包模式,我觉得有以下优点;
1. package内高内聚,package间低耦合
按照PBF的分包模式,每一个模块相关的类都放在对应的模块当中,模块内部实现了高内聚,而各个包之间实现了低耦合的关系
2.很容易删除某一个功能
如果是PBL的分包,当我们需要删除某一个功能的时候,我们要挨个包去找对应的类,一个个删除,这很可能会导致各种错误,而PBF分包,我们就可以直接进行整个功能包的删除,达到快速删除功能的实现;
3. 高度抽象,只通过class类来分离对应的逻辑代码
我们在解决实际问题的过程中通常是从抽象到具体,而PBF模式正好符合这种规则,每一个模块都是高度抽象的,然后模块内部进行具体细节的实现,而且在PBF模式中我们不用在进行分包和分离class来进行逻辑代码的管理,只采用class分离就可以实现了.
2.3 本项目的分包分类管理思想
那么在这个demo当中我在功能划分上面总体采用的是PBF的分包模式,但是在每通用的一些基类,工具类,管理类中我采用的是将其分在同一个包下面,这其实可以看做是一个辅助功能模块,它辅助其他的每一个功能模块,所以在内部采用了分包分类的管理方式,即PBL,主要是为了实现代码的复用,而且并不影响其他功能的高内聚与低耦合性;
本项目的列表显示和表格布局采用的是listview,gridview,而没有使用RecyleView,其实listview与gridview其实是一种典型的mvc的设计模式,adapter负责控制数据的展示方式,所以这里我将Adapter归为到控制层中去,而从Adapter抽取出来的holder归为视图展示层,这里holder主要是引入布局和通过adapter传递过来的数据进行控件的设置如图2-2所示:
与一般的mvc不同的是,这里我将所有的Activity及Fragment的视图显示都抽取到了对应的displayview的包下面进行视图的统一管理,在代码层实现了C控制层Activity臃肿的问题,如图2-3所示:
3. 项目的总体框架和具体实现的功能
3.1 项目实现了几个比较简单的功能,主要的功能图如下图所示:
3.2 项目基类的基本抽取
项目主要抽取了如下基类:
这里着重介绍一下BaseUiDisplay与BaseNetRequest,BaseUiDisplay主要是通过网络数据的加载情况来显示加载失败,错误,空,成功的界面,其中前三个视图是所有界面都都一致的,而成功视图交给具体子类去实现,BaseNetRequest主要用于做网络数据请求,用于返回网络请求的结果,最终通过数据结果返回状态通知ui进行对应的显示,这里为了方便我没有做缓存处理,需要详细了解的请移步到我的github上面进行源码下载;
项目具体地址:https://github.com/ZwjDreamMail/robotMVC