Android中的MVP模式

news2024/10/24 2:21:47

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 只负责验证用户名是否有效。

public class UserModel {

    // 简单模拟用户名验证
    public boolean isValidUser(String username) {
        return username != null && !username.trim().isEmpty();
    }
}

2. View 接口

View 是应用的 UI 层。在 MVP 模式中,我们通常会为 View 创建一个接口,定义所有 UI 操作。Activity 或 Fragment 将实现这个接口。

public interface IUserViewInterface {
    // 显示成功消息
    void showSuccessMessage();

    // 显示错误消息
    void showErrorMessage();
}

3. Presenter

Presenter 负责处理用户操作,将输入的数据传递给 Model 进行处理,并且根据处理结果来更新 View。

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,并处理用户交互。

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 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】拆分详解 - 模板

文章目录 一、泛型编程二、函数模板1. 概念2. 语法3. 函数模板的原理4. 函数模板的实例化5. 模板参数的匹配原则 三、类模板1. 语法2. 实例化 四、模板的特化1. 概念2. 函数模板特化3. 类模板特化3.1 全特化3.2 偏特化 / 半特化3.3 应用示例 4. 小结 五、模板的分离编译1. 分离…

秋招面试题记录_半结构化面试

c八股(可能问的多一点) 1.简单说说C11语法特性 答&#xff1a; 1.auto以及decltype自动类型推导&#xff0c;避免手动声明复杂类型&#xff0c;减少冗长代码提升了可读性和安全性。 2.智能指针 自动释放内存 (具体说说) 有shared和unique 差异主要体现在所有权、内存开销、…

微积分复习笔记 Calculus Volume 1 - 3.4 Derivatives as Rates of Change

3.4 Derivatives as Rates of Change - Calculus Volume 1 | OpenStax

京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?

我同学最近在面试java的岗位, 这是他遇到的某些关于java的JVM中垃圾回收相关的部分的问题, 他来问我, 我特以此文章来解答. 公司 京东 base 北京 面试时间 2024年10月23日16:00:00 他跟我说, 面试官一上来就问了一个关于JVM的问题, 直接就给他难住了, 问题是 : 哪些情况下…

数据结构《顺序表》

文章目录 前言一、什么是顺序表&#xff1f;1.1 顺序表的概念1.2 顺序表的建立 二、MyArrayList的实现三、顺序表的方法四、关于顺序表的例子总结 前言 提示&#xff1a;这里涉及到的ArrayList类是一个泛型类&#xff0c;同时后面的很多内容都会涉及到泛型&#xff0c;如果不了…

【蓝队技能】【内网隧道工具流量分析】FRPNPSreGeorgVenom

蓝队技能 FRP&NPS&reGeorg&Venom 蓝队技能总结前言一、FRP1.1 流量分析1.2 特征提取 二 NPS1.1 流量分析1.2 特征提取 三、reGeor1.1 特征提取 四、Venom1.1 特征提取 总结 前言 本文聚焦内网隧道代理技术&#xff0c;涵盖Frp、Nps、Neo-reGeorg及Venom等工具。这些…

潜水定位通信系统的功能和使用方法_鼎跃安全

潜水定位通信系统是保障潜水安全与作业高效的关键设备。它利用先进的声呐、无线电等技术&#xff0c;可精准定位潜水员位置。在水下能实现潜水员之间以及与水面的双向通信&#xff0c;确保信息及时传递。具备高可靠性和稳定性&#xff0c;即使在复杂水环境中也能正常运行。 一、…

Git Push(TODO)

最近经常碰到GIT push不上去的问题。到处求人解决也真是尴尬&#xff0c;想自己看看&#xff0c;所以刚刚在github上建了一个仓&#xff0c;试了下。结果如下&#xff1a; 暂时可能还不行&#xff0c;因为数据都是加密的&#xff0c;没法看到具体GIT的交互信息。。。 后面再想办…

算法的学习笔记—两个链表的第一个公共结点(牛客JZ52)

&#x1f600;前言 在链表问题中&#xff0c;寻找两个链表的第一个公共结点是一个经典问题。这个问题的本质是在两个单链表中找到它们的相交点&#xff0c;或者说它们开始共享相同节点的地方。本文将详细讲解这个问题的解题思路&#xff0c;并提供一种高效的解决方法。 &#x…

WPFDeveloper正式版发布

WPFDeveloper WPFDeveloper一个基于WPF自定义高级控件的WPF开发人员UI库&#xff0c;它提供了众多的自定义控件。 该项目的创建者和主要维护者是现役微软MVP 闫驚鏵: https://github.com/yanjinhuagood 该项目还有众多的维护者&#xff0c;详情可以访问github上的README&…

Golang | Leetcode Golang题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; type Solution struct {rects [][]intsum []int }func Constructor(rects [][]int) Solution {sum : make([]int, len(rects)1)for i, r : range rects {a, b, x, y : r[0], r[1], r[2], r[3]sum[i1] sum[i] (x-a1)*(y-b1)}return Sol…

SpringBoot项目ES6.8升级ES7.4.0

SpringBoot项目ES6.8.15 升级到 ES7.4.0 前言 由于公司内部资产统一整理&#xff0c;并且公司内部部署有多个版本的es集群&#xff0c;所以有必要将目前负责项目的ES集群升级到公司同一版本7.4.0。es6到es7的升级变化还是挺大的&#xff0c;因此在这里做一下简单记录&#xf…

从新手到高手:map和set的使用技巧全攻略(C++)

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 前言&#xff1a; 本章节讲解的map和set底层…

C++新基础类型(C++11~C++20)

本文章记录C11~C20的新基础类型。 1.整数类型long long long long类型是C11引入的。在C标准中规定&#xff0c;long long是一个至少为64位的整数类型。可以使用LL和ULL字面量后缀进行初始化。格式化打印时分别用%lld和%llu。 long long x 12345LL; unsigned long long y 4…

简单的windows java -jar 无法启动jar包解决方法

简单的windows java -jar 无法启动jar包解决方法 1. 问题 我们项目是使用nacos作为注册中心以及配置中心&#xff0c;我们本地使用idea 进行服务配置以及启动发现没有问题&#xff0c;然后我们的服务经过maven install 打包后发布到LINUX服务启动也没有问题&#xff0c;但是我…

Artistic Oil Paint 艺术油画着色器插件

只需轻轻一点&#xff0c;即可将您的视频游戏转化为艺术品&#xff01;&#xff08;也许更多…&#xff09;。 ✓ 整个商店中最可配置的选项。 ✓ 六种先进算法。 ✓ 细节增强算法。 ✓ 完整的源代码&#xff08;脚本和着色器&#xff09;。 ✓ 包含在“艺术包”中。 &#x1f…

上拉电阻和下拉电阻在电路中的作用(一)

上拉电阻和下拉电阻在电路中的作用&#xff08;一&#xff09; 1.什么是上下拉电阻2.上下拉电阻的作用&#xff1a;2.1.维持输入引脚处于稳定状态。2.2.配合三极管和MOS进行电平转换电路设计2.3.OC、OD电路&#xff08;Open Collector集电极开路、Open Drain漏电极开路&#xf…

优化UVM环境(九)-将interface文件放在env pkg外面

书接上回&#xff1a; 优化UVM环境&#xff08;八&#xff09;-整理project_common_pkg文件 My_env_pkg.sv里不能包含interface&#xff0c;需要将my_intf.sv文件放在pkg之外

Leetcode 1135. 最低成本连通所有城市

1.题目基本信息 1.1.题目描述 想象一下你是个城市基建规划者&#xff0c;地图上有 n 座城市&#xff0c;它们按以 1 到 n 的次序编号。 给你整数 n 和一个数组 conections&#xff0c;其中 connections[i] [x_i, y_i, cost_i] 表示将城市 x_i 和城市 y_i 连接所要的cost_i&…

【scene_manager】与 MoveIt 机器人的规划场景进行交互

scene_manager Scene Manager包是由 Robotnik 创建的 ROS 包&#xff0c;旨在帮助构建和与 MoveIt 机器人的规划场景进行交互。 背景信息 MoveIt 规划场景 是一个用于存储机器人周围世界的表示&#xff08;外部碰撞&#xff09;以及机器人自身状态&#xff08;内部碰撞和当…