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