Android中的MVP模式

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 处理了所有的业务逻辑,并且是 ViewModel 之间的桥梁。这样,你的 Activity 只负责展示 UI 和用户交互,业务逻辑都交给 Presenter 来处理。这样的架构便于单元测试、代码维护和扩展。

在这个例子中:

  • MainActivity 实现了 UserView 接口,负责捕获用户交互和更新界面。
  • UserPresenterViewModel 之间的桥梁,它负责处理逻辑,将结果反馈给 View。
  • UserModel 提供简单的业务逻辑(验证用户名是否有效)。

通过这种结构,代码的分工更加明确,每个部分都有自己的职责,代码的维护性、扩展性以及测试性都得到了提升。

核心主要是通过UI的接口类解耦,UI类里去实现这个UI的接口,这样Presenter就可以感知UI的接口,实现View和Model的解耦合。

4o

相关推荐
阿巴斯甜14 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker14 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952715 小时前
Andorid Google 登录接入文档
android
黄林晴16 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android