MVP(Model-View-Presenter)架构在 Android 开发中是一种流行的架构模式,它将业务逻辑和 UI 代码分离,通过 Presenter 来处理用户的操作和界面更新。MVP 提高了代码的可维护性和测试性,特别是 Presenter 中的逻辑可以单独测试。
MVP 模式的三大组件
- Model:负责业务逻辑和数据层的处理,比如访问数据库、网络请求等。
- View:负责显示数据和捕获用户输入,通常对应于 Activity、Fragment 等 UI 组件。
- Presenter:作为 View 和 Model 的桥梁,处理从 View 发来的用户操作,并根据 Model 提供的数据更新 View。
简单 MVP 实现步骤:
我们将创建一个简单的 Android 应用来展示 MVP 模式。在这个例子中,用户输入用户名并点击按钮,Presenter 将验证用户名是否有效,并更新 UI 来展示结果。
1. Model
Model 是业务逻辑和数据层。在这个例子中,Model 只负责验证用户名是否有效。
java
public class UserModel {
// 简单模拟用户名验证
public boolean isValidUser(String username) {
return username != null && !username.trim().isEmpty();
}
}
2. View 接口
View 是应用的 UI 层。在 MVP 模式中,我们通常会为 View 创建一个接口,定义所有 UI 操作。Activity 或 Fragment 将实现这个接口。
java
public interface IUserViewInterface {
// 显示成功消息
void showSuccessMessage();
// 显示错误消息
void showErrorMessage();
}
3. Presenter
Presenter 负责处理用户操作,将输入的数据传递给 Model 进行处理,并且根据处理结果来更新 View。
java
public class UserPresenter {
private IUserViewInterface mUserViewInterface;
private UserModel model;
public UserPresenter(IUserViewInterface userViewInterface) {
this.mUserViewInterface = userViewInterface;
this.model = new UserModel();
}
public void checkUser(String username) {
// 通过 Model 验证用户名
if (model.isValidUser(username)) {
// 用户名有效,更新 View
mUserViewInterface.showSuccessMessage();
} else {
// 用户名无效,更新 View
mUserViewInterface.showErrorMessage();
}
}
}
4. 实现 View (Activity)
我们的 MainActivity
实现了 UserView
接口,负责显示 UI,并处理用户交互。
java
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity implements IUserViewInterface {
private EditText usernameEditText;
private Button checkButton;
private UserPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化 UI 元素
usernameEditText = findViewById(R.id.user_name_edit_text);
checkButton = findViewById(R.id.check_button);
// 初始化 Presenter
presenter = new UserPresenter(this);
// 设置按钮点击事件
checkButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取输入的用户名并传递给 Presenter 处理
String username = usernameEditText.getText().toString();
presenter.checkUser(username);
}
});
}
// 实现 UserView 接口的方法
@Override
public void showSuccessMessage() {
// 显示成功的消息
Toast.makeText(this, "Username is valid", Toast.LENGTH_SHORT).show();
}
@Override
public void showErrorMessage() {
// 显示错误的消息
Toast.makeText(this, "Username is invalid", Toast.LENGTH_SHORT).show();
}
}
5. 布局文件 (XML)
创建简单的布局,包括一个 EditText
用于输入用户名,一个 Button
用于触发验证。
res/layout/activity_main.xml
:
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/user_name_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter username" />
<Button
android:id="@+id/check_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Check Username" />
</LinearLayout>
6. 总结
通过 MVP 架构,你可以清晰地分离业务逻辑和 UI 控制。Presenter
处理了所有的业务逻辑,并且是 View
和 Model
之间的桥梁。这样,你的 Activity
只负责展示 UI 和用户交互,业务逻辑都交给 Presenter
来处理。这样的架构便于单元测试、代码维护和扩展。
在这个例子中:
MainActivity
实现了UserView
接口,负责捕获用户交互和更新界面。UserPresenter
是View
和Model
之间的桥梁,它负责处理逻辑,将结果反馈给 View。UserModel
提供简单的业务逻辑(验证用户名是否有效)。
通过这种结构,代码的分工更加明确,每个部分都有自己的职责,代码的维护性、扩展性以及测试性都得到了提升。
核心主要是通过UI的接口类解耦,UI类里去实现这个UI的接口,这样Presenter就可以感知UI的接口,实现View和Model的解耦合。
4o