MVP架构分包

在Android开发中,MVP(Model-View-Presenter)架构被广泛应用于项目开发中,它将应用程序分为三个部分:Model(模型)、View(视图)和Presenter(主持人),分离了业务逻辑和界面逻辑,使得代码更加清晰和易于维护。在大型项目中,为了更好地组织代码和减少耦合性,可以将MVP架构按照功能模块进行分包,本文将介绍如何在Android项目中使用MVP架构分包。

MVP架构概述

MVP架构是一种设计模式,它将应用程序分为三个部分:

  • Model(模型):负责处理数据的获取、存储和处理逻辑。
  • View(视图):负责展示UI界面和接收用户的操作。
  • Presenter(主持人):负责处理业务逻辑和更新View。

MVP架构的优点包括:

  • 分离了业务逻辑和界面逻辑,使得代码更易于维护和测试。
  • 降低了模块之间的耦合度,方便单元测试和重构。
  • 提高了代码的可读性和可维护性。

MVP架构分包

在大型项目中,为了更好地组织代码和减少耦合性,可以将MVP架构按照功能模块进行分包。下面是一个示例项目结构:

app
├── base
│   ├── BasePresenter.kt
│   ├── BaseView.kt
│   └── BaseModel.kt
├── feature1
│   ├── Feature1Activity.kt
│   ├── Feature1Presenter.kt
│   └── Feature1Model.kt
├── feature2
│   ├── Feature2Activity.kt
│   ├── Feature2Presenter.kt
│   └── Feature2Model.kt
└── ...
  • base包:存放基础类,如BasePresenter、BaseView和BaseModel,用于其他功能模块的继承。
  • feature1包:存放功能一相关的类,如Feature1Activity、Feature1Presenter和Feature1Model。
  • feature2包:存放功能二相关的类,如Feature2Activity、Feature2Presenter和Feature2Model。

示例代码

BasePresenter.kt

import java.lang.ref.WeakReference

abstract class BasePresenter<T> {

    private var viewRef: WeakReference<T>? = null

    fun attachView(view: T) {
        viewRef = WeakReference(view)
    }

    fun detachView() {
        viewRef?.clear()
    }

    protected fun getView(): T? {
        return viewRef?.get()
    }

    abstract fun start()
}

BaseView.kt

interface BaseView {

    fun showLoading()

    fun hideLoading()

    fun showError(errorMsg: String)

}

BaseModel.kt

interface BaseModel {

    fun loadData(callback: (String) -> Unit)

}

Feature1Presenter.kt

class Feature1Presenter : BasePresenter<Feature1View>(), BaseModel {

    override fun start() {
        getView()?.showLoading()
        loadData {
            getView()?.hideLoading()
            getView()?.showData(it)
        }
    }

    override fun loadData(callback: (String) -> Unit) {
        // 模拟加载数据
        callback("Data from Feature1")
    }

}

Feature1View.kt

interface Feature1View : BaseView {

    fun showData(data: String)

}

Feature1Activity.kt

class Feature1Activity : AppCompatActivity(), Feature1View {

    private lateinit var presenter: Feature1Presenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_feature1)

        presenter = Feature1Presenter()
        presenter.attachView(this)
        presenter.start()
    }

    override fun showLoading() {
        // 显示加载中
    }

    override fun hideLoading() {
        // 隐藏加载中
    }

    override fun showError(errorMsg: String) {
        // 显示错误信息
    }

    override fun showData(data: String) {
        // 显示数据
    }

}

类图

classDiagram
    class BasePresenter
    class BaseView
    class BaseModel
    class Feature1Presenter
    class Feature1View
    class Feature1Activity

    BasePresenter <|-- Feature1Presenter