这是我参与「第四届青训营 」笔记创作活动的第17天
结合项目总结下对架构和分层的思考
前言
最近项目准备提交了,在整理项目结构。由于项目要求是使用 MVVM 架构(即 Model-View-ViewModel),就照着架构分了层。
MVVM 架构和其他常见的架构(比如MVC,MVP)相比,不同之处就在于一个是使用 Controller 层(MVP 里为 Presenter)进行数据(Model)到视图(View)映射处理,一个是使用 ViewModel 进行映射处理,Model 和 View 都是一样的。
也就是说,这些架构可以简单归类为 MVX 架构,根据处理映射关系的不同来进行的区分(即X的不同)。
对于其他的架构这里不做展开,下面结合项目来讨论下 MVVM 架构的分层。
MVVM 中的分层
虽然 MVVM 看上去是把架构分为三层(即 Model,View,ViewModel 三层),但在项目具体落地的时候,还会根据实现方式来抽离出其他的层级(比如 Adapter 层等等)。
项目分层如下图。
其中 model 包就对应 Model 层,View 和 ViewModel 都放在 ui 里,View 在 Fragment 中进行绑定。
我们先关注 MVVM 的三层对应的代码。Java 代码强调 "万物皆对象",所以 M,V,VM 三层都有其对应的 Java 对象,比如 Model 对应数据库的实体类(Entity),View 对应 Fragment 布局中的 View 对象,ViewModel 对应 ViewModel 对象。
这就是以 Java 对象为单位的分层,通过这样分层,我们可以将模型中对应的模块映射到代码上。
但其实项目中不只有这三层的对象,还有其他部分,这就涉及到其他部分的分层。
其他部分的分层
我们一个个包往下看。
adapter 层(适配器)
之所以使用 Adapter 对象,是因为对应模块视图中使用了 RecyclerView
下面是 RecyclerView 中的注释原文
Adapter: A subclass of RecyclerView.Adapter responsible for providing views that represent items in a data set.
百度翻译后:
适配器:RecyclerView的一个子类。负责提供表示数据集中项的视图的适配器。
这其实涉及到设计模式中的适配器模式,适配器在该模式中,一般持有源数据对象,然后实现方法转化成需要使用的对象。
在实际项目中,Adapter 持有数据集合对象,然后在 onBindViewHolder(holder: ViewHolder, position: Int) 方法中将集合对象中的数据映射到 View 对象中。
constant 层(应用常量)
主要用于存在全局的常量,比如 接口请求 url 等等。
DAO 层
DAO(Data Access Object) 数据访问对象。
负责提供查询数据的接口。
Database 层
数据库层,用于定义数据库。
monitor 层
主要是性能测试中用到监视器等。
Network 层
网络层,主要存放与服务器交互的请求类等。
util 层
工具层,主要存放工具类等。
总结与思考
结合最近项目开发和学习的知识,我总结出了以下结论:
架构是以 对象/文件 为界限的代码和相关资源的层次划分,分层则是在架构的基础上,以包为界限的 对象/文件 的划分。