一、概念解释
MVP 是一种将界面逻辑(View)与业务逻辑(Presenter)和数据逻辑(Model)分离的架构,通过接口解耦,使得代码更易于维护、测试和扩展。
com.example.mvpapp
│
├── model
│ └── LoginModel.java
│
├── view
│ ├── LoginView.java (接口)
│ └── LoginActivity.java
│
├── presenter
│ └── LoginPresenter.java
│
└── MainActivity.java (可选跳转页)
View(视图层)
-
职责:界面显示 + 用户交互事件监听。
-
不能做逻辑处理,也不直接访问数据。
-
通过调用
Presenter
来触发业务逻辑(如登录、拉数据)。 -
提供接口(如
onLoginSuccess()
)供Presenter
调用,返回结果并更新 UI。
Presenter(表示层/桥梁层)
-
职责:控制器角色,处理所有的业务逻辑。
-
连接 View 和 Model:
-
从 View 获取用户输入;
-
调用 Model 获取数据;
-
处理完数据后,再调用 View 接口更新界面。
-
-
完全不涉及 UI 控件,只调用 View 暴露的接口。
Model(数据层)
-
职责:接收来自 Presenter 的请求,处理数据逻辑,并将结果返回给 Presenter。
- 提供数据访问接口(如数据库操作、网络请求等)
数据流向:
- 用户操作流:用户通过View进行操作 → View将操作委托给Presenter → Presenter处理逻辑并操作Model
- 数据更新流:Model数据变化 → Presenter获取新数据 → Presenter更新View显示
二、MVP 使用流程(以登录为例)
-
用户点击“登录” →
View
捕获点击事件; -
View
调用Presenter.login(username, password)
; -
Presenter
接收参数,调用Model
执行登录逻辑; -
Model
返回结果:-
如果是同步:立即返回结果给
Presenter
; -
如果是异步(如网络请求):通过接口回调
Presenter
;
-
-
Presenter
获取结果后,调用View
提供的接口,更新界面。
三、三者关系
方向 | 类型 | 说明 |
---|---|---|
View → Presenter | 强依赖 | View 持有 Presenter 实例,主动调用业务方法 |
Presenter → View | 接口依赖 | Presenter 持有view的接口引用 |
Presenter → Model | 强依赖 | Presenter 调用 Model 实列 |
Model → Presenter | 接口回调 | Model 在异步场景下通过接口回调通知 Presenter,但 Model 持有的是一个 Callback 接口,不是具体的 Presenter 类 |