Android架构——MvpClean(kotlin)!!!

本文介绍了MvpClean架构,强调其在大型项目和多人合作中的优势。Clean架构通过洋葱形分层实现代码的独立性和可测试性。在Android中,MvpClean分为外层(UI、Storage、Network)、中层(Presenter、Converter)和内层(Interactor、Model、Repository、Executor)。文章详细阐述了各层的职责和项目结构,提供了具体的实现示例。
摘要由CSDN通过智能技术生成

概述

第一次知道MvpClean还是在搜寻架构组件的博客时,出于好奇便学习了下。MvpClean给我的第一感觉是烦,写一个功能要创建n个文件,但不可否认对于大型项目和多人合作开发有很大的优势。

Clean架构

在Clean架构中,代码被分层成洋葱形,层层包裹,其中有一个依赖性规则:内层不能依赖外层,即内层不知道有关外层的任何事情,所以这个架构是向内依赖的。看个图感受一下:
图片由Bob大叔提供

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<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值