概述
第一次知道MvpClean还是在搜寻架构组件的博客时,出于好奇便学习了下。MvpClean给我的第一感觉是烦,写一个功能要创建n个文件,但不可否认对于大型项目和多人合作开发有很大的优势。
Clean架构
在Clean架构中,代码被分层成洋葱形,层层包裹,其中有一个依赖性规则:内层不能依赖外层,即内层不知道有关外层的任何事情,所以这个架构是向内依赖的。看个图感受一下:
Clean架构可以使代码有如下特性:
1. 独立于架构
2. 易于测试
3. 独立于UI
4. 独立于数据库
5. 独立于任何外部类库
MvpClean在Android中的表现
普通android应用一般需要如下三层:
外层:实现层——接口实现层是体现架构细节的地方。实现架构的代码是所有不用来解决问题的代码,这包括所有与安卓相关的东西,比如创建Activity和Fragment,发送Intent以及其他联网与数据库的架构相关的代码。
中层:接口适配层——接口适配层的目的就是桥接逻辑层和架构层的代码。
内层:逻辑层——逻辑层包含了真正解决问题的代码。这一层不包含任何实现架构的代码,不用模拟器也应能运行这里的代码。这样一来逻辑代码就有了易于测试、开发和维护的优点。
每一个位于核心层外部的层都应能将外部模型转成可以被内层处理的内部模型。内层不能持有属于外层的模型类的引用。举个例子,当逻辑层的模型不能直接优雅地展现给用户,或是需要同时展示多个逻辑层的模型时,最好创建一个ViewModel类来更好的进行UI展示。这样一来,就需要一个属于外层的Converter类来将逻辑层模型转换成合适的ViewModel。
项目结构
一般来说一个安卓应用的结构如下:
外层项目包:UI,Storage,Network等等。
中层项目包:Presenter,Converter。
内层项目包:Interactor,Model,Repository,Executor。
外层
外层体现了框架的细节:
- UI – 包括所有的Activity,Fragment,Adapter和其他UI相关的Android代码。
- Storage – 用于让交互类获取和存储数据的接口实现类,包含了数据库相关的代码。包括了如ContentProvider或DBFlow等组件。
- Network – 网络操作。
中层
桥接实现代码与逻辑代码的Glue Code:
- Presenter – presenter处理UI事件,如单击事件,通常包含内层Interactor的回调方法。
- Converter – 负责将内外层的模型互相转换。
内层
内层包含了最高级的代码,里面都是POJO类,这一层的类和对象不知道外层的任何信息,且应能在任何JVM下运行:
- Interactor – Interactor中包含了解决问题的逻辑代码。这里的代码在后台执行,并通过回调方法向外层传递事件。在其他项目中这个模块被称为用例Use Case。一个项目中可能有很多小Interactor,这符合单一职责原则,而且这样更容易让人接受。
- Model – 在业务逻辑代码中操作的业务模型。
- Repository – 包含接口让外层类实现,如操作数据库的类等。Interactor用这些接口的实现类来读取和存储数据。这也叫资源库模式Repository Pattern。
- Executor – 通过Thread Executor让Interactor在后台执行。一般不需要修改这个包里的代码。
use case个人感觉可以理解为一次事务
网上Clean代码
从逻辑层开始编写,有利于提前测试
- domain包
创建初期基类:
interface Interactor {
fun execute()
}
实现在后台运行Interactor:
abstract class AbstractInteractor constructor(val threadExecutor: Executor, val mainThread: MainThread) : Interactor {
protected var mIsCanceled: Boolean = false
protected var mIsRunning: Boolean = false
abstract fun run()
fun cancel() {
mIsCanceled = true
mIsRunning = false<