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

相关推荐
张风捷特烈1 小时前
Flutter 伪3D绘制#03 | 轴测投影原理分析
android·flutter·canvas
omegayy4 小时前
Unity 2022.3.x部分Android设备播放视频黑屏问题
android·unity·视频播放·黑屏
mingqian_chu4 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
自动花钱机4 小时前
Kotlin问题汇总
android·开发语言·kotlin
行墨7 小时前
Kotlin 主构造函数
android
前行的小黑炭7 小时前
Android从传统的XML转到Compose的变化:mutableStateOf、MutableStateFlow;有的使用by有的使用by remember
android·kotlin
_一条咸鱼_7 小时前
Android Compose 框架尺寸与密度深入剖析(五十五)
android
在狂风暴雨中奔跑7 小时前
使用AI开发Android界面
android·人工智能
行墨7 小时前
Kotlin 定义类与field关键
android
信徒_8 小时前
Mysql 在什么样的情况下会产生死锁?
android·数据库·mysql