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

相关推荐
Eastsea.Chen1 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年8 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿11 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神12 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛12 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法13 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter14 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快15 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl15 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江15 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin