当前位置: 首页 > news >正文

【Android】MVP架构

MVP架构简介

MVP(Model-View-Presenter)是一种常见的软件架构模式,尤其在Android应用开发中被广泛使用。它将应用程序分为三层:Model、View 和 Presenter,以实现职责分离,提高代码的可维护性和可测试性。

1. Model(模型)

  • 定义:负责处理应用程序的数据逻辑,包括与数据库、网络、API等数据源的交互。
  • 职责:提供数据,并将其返回给 Presenter,不涉及任何UI相关逻辑。

2. View(视图)

  • 定义:负责展示用户界面,接收用户的输入并将其传递给 Presenter。
  • 职责:展示由 Presenter 提供的数据,并根据用户操作调用 Presenter 的方法。View 层不直接处理逻辑,只展示内容。

3. Presenter(演示者)

  • 定义:作为 View 和 Model 之间的桥梁,负责处理逻辑和协调数据流。
  • 职责:
    • 从 View 接收用户输入,调用 Model 获取数据。
    • 将数据处理结果返回给 View 以更新UI。
    • Presenter 不直接操作UI,而是通过接口与 View 进行交互。

MVP与MVC的区别

1. 核心组成部分的区别

  • MVP
    • Model:负责数据逻辑的处理,类似于MVC中的Model。
    • View:展示数据、处理用户界面交互,但不会直接处理业务逻辑,所有逻辑都交给 Presenter。
    • Presenter:作为中间层,负责从 Model 获取数据并处理业务逻辑,然后将数据传递给 View。Presenter 直接与 View 交互。
  • MVC
    • Model:同样负责数据逻辑的处理,与 MVP 中的 Model 类似。
    • View:展示数据并处理用户输入,但可以直接与 Controller 进行交互。
    • Controller:控制器响应用户的输入,更新 Model 和 View,但它不直接操作 View,而是通知 View 自行更新。

2. 交互方式的区别

  • MVP
    • View 与 Model 之间没有直接交互。View 只负责调用 Presenter,Presenter 是唯一能与 Model 交互的部分,然后 Presenter 将结果返回给 View 来更新界面。
    • 双向交互:View 和 Presenter 是双向交互的,View 可以调用 Presenter,Presenter 也可以调用 View 来更新UI。
  • MVC
    • View 可以直接与 Model 交互。在MVC中,View可以直接从Model中获取数据,虽然一般情况下是通过Controller来协调。
    • 单向交互:View 和 Controller 之间的交互通常是单向的,用户的输入会通过 View 传递给 Controller,Controller 再更新 Model,最后通知 View 更新UI。

3. 视图的控制权

  • MVP
    • Presenter 控制视图:在MVP模式中,Presenter 负责处理所有业务逻辑,并决定何时以及如何更新 View。View 不进行逻辑处理,只是被动地展示数据。
  • MVC
    • Controller 充当中介:在MVC中,Controller 只是起到协调作用,它不会主动控制 View 的更新,通常会将新的数据传递给 View 或通知 View 进行自我更新。

MVP架构优点

  1. View层与Model层完全分离

  2. 所有View层 和 Model层 逻辑交互都在Presenter

  3. 后续扩展性/可维护性强,M层(负责数据业务模型), P层(负责M层与V层的交互逻辑)

  4. 定位修改Bug方便:

    如果是修改界面交互相关的,直接找V层修改

    如果是修改数据业务逻辑,直接找M层修改

image-20241018141154575

MVP架构特点

关系:

  1. View收到用户的操作

  2. View把用户的操作,交给Presenter

  3. Presenter直接操作Model进行业务逻辑处理

  4. Model处理完毕后,通知Presenter

  5. Presneter收到通知后,在去更新View

方式:

是双向的通信方式

优点:

  1. View层与Model层完全分离
  2. 所有的逻辑交互都在Presenter
  3. MVP分层较为严谨

image-20241018141452545

image-20241018165112763

示例

  1. Model (数据层)

Model 负责处理数据逻辑,判断用户名和密码是否正确。

public class LoginModel {// 模拟用户登录数据public boolean validateUser(String username, String password) {// 简单模拟,假设用户名为"user",密码为"password"时登录成功return username.equals("user") && password.equals("password");}
}
  1. View (视图层)

View 负责显示界面,并将用户的输入传递给 Presenter,它不会直接处理业务逻辑。

public interface LoginView {// 展示登录成功的信息void showLoginSuccess();// 展示登录失败的信息void showLoginError();// 获取用户名String getUsername();// 获取密码String getPassword();
}

具体实现:

public class LoginActivity extends AppCompatActivity implements LoginView {private EditText usernameEditText, passwordEditText;private Button loginButton;private LoginPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);usernameEditText = findViewById(R.id.username);passwordEditText = findViewById(R.id.password);loginButton = findViewById(R.id.login_button);presenter = new LoginPresenter(this, new LoginModel());loginButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {presenter.onLoginClicked();}});}@Overridepublic void showLoginSuccess() {Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();}@Overridepublic void showLoginError() {Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();}@Overridepublic String getUsername() {return usernameEditText.getText().toString();}@Overridepublic String getPassword() {return passwordEditText.getText().toString();}
}
  1. Presenter (逻辑层)

Presenter 负责处理业务逻辑,并将数据从 Model 传递到 View。

public class LoginPresenter {private LoginView view;private LoginModel model;public LoginPresenter(LoginView view, LoginModel model) {this.view = view;this.model = model;}// 当用户点击登录按钮时调用public void onLoginClicked() {String username = view.getUsername();String password = view.getPassword();// 通过 Model 验证用户输入if (model.validateUser(username, password)) {view.showLoginSuccess();} else {view.showLoginError();}}
}
  1. 布局文件 (activity_login.xml)

简单的登录界面,包含输入框和按钮。

<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"><EditTextandroid:id="@+id/username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="用户名" /><EditTextandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="密码"android:inputType="textPassword" /><Buttonandroid:id="@+id/login_button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="登录" />
</LinearLayout>

工作流程:

  1. 用户在 LoginActivity 中输入用户名和密码并点击登录按钮。
  2. LoginActivity 作为 View 层,将用户输入传递给 LoginPresenter
  3. LoginPresenter 从 View 获取用户名和密码,并调用 LoginModel 来验证用户输入。
  4. LoginModel 验证输入是否正确,然后将结果返回给 LoginPresenter
  5. LoginPresenter 根据验证结果通知 LoginActivity 更新UI,显示登录成功或失败的消息。

已经到底啦!!

相关文章:

【Android】MVP架构

MVP架构简介 MVP&#xff08;Model-View-Presenter&#xff09;是一种常见的软件架构模式&#xff0c;尤其在Android应用开发中被广泛使用。它将应用程序分为三层&#xff1a;Model、View 和 Presenter&#xff0c;以实现职责分离&#xff0c;提高代码的可维护性和可测试性。 …...

Web服务器之Nginx

Nginx&#xff08;发音为Engine X&#xff09;是一款开源的高性能HTTP和反向代理服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。由伊戈尔赛索耶夫&#xff08;Igor Sysoev&#xff09;为俄罗斯访问量第二的Rambler.ru站点开发&#xff0c;Nginx自发布以来&#xff0c;凭借…...

【大模型实战篇】大模型分词算法Unigram及代码示例

1. 算法原理介绍 与 BPE 分词&#xff08;参考《BPE原理及代码示例》&#xff09;和 WordPiece 分词&#xff08;参考《WordPiece原理及代码示例》&#xff09;不同&#xff0c;Unigram 分词方法【1】是从一个包含足够多字符串或词元的初始集合开始&#xff0c;迭代地删除其中的…...

Dockerfile搭建ELK

使用 Dockerfile 安装 ELK 一、引言 ELK Stack&#xff08;Elasticsearch, Logstash, Kibana&#xff09;是一种流行的日志管理和分析解决方案。它允许用户实时搜索、分析和可视化日志数据。通过 Docker&#xff0c;可以方便地部署 ELK &#xff0c;快速获取一个功能齐全的日…...

在合规的地方怎么用EACO地球链兑换交换价值?

地球链EACO&#xff08;EarthChain&#xff0c;简称$E&#xff09;是一种虚拟数字资产。 目前在中国大陆&#xff0c;虚拟资产相关业务活动属于金融活动&#xff0c;包括虚拟资产的交易、兑换等操作&#xff0c;因此应该谨慎去寻求如何用它来交换价值。 虚拟资产交易炒作活动&…...

VS无法安装Win10SDK_10.0.2200,快捷方法

Visual Studio无法安装Win10SDK_10.0.2200&#xff0c;我在安装VS2019、2022提示&#xff0c;软件就不能编译。 因为之前安装过VS软件&#xff0c;重新安装软件提示“无法安装”。 原因 之前安装在D盘&#xff0c;现在没有D盘了 说明 因为电脑第一次安装VS&#xff0c;会自动安…...

github多个账号配置多个SSH秘钥

背景 对于有多个github账号的同学&#xff0c;需要配置多个ssh秘钥分别管理多个账号。 方法 1、生成多个SSH秘钥 # 为第一个 GitHub 账号生成密钥 ssh-keygen -t ed25519 -C "your_email_1example.com" -f ~/.ssh/id_ed25519_github_work# 为第二个 GitHub 账号生…...

静态/动态代理详解,一次性看完再也不会搞不清!

代理官方原文翻译&#xff1a; 给其他对象提供一个代理或者占位符&#xff0c;来控制对这个对象的访问。 代理最核心的思想&#xff1a; 在客户端和目标对象之间创建一个“中介”&#xff0c;用于保护目标对象和增强目标对象 静态代理&#xff1a; 该代理对象需要我们手动…...

Webserver(2)GCC

目录 安装GCCVScode远程连接到虚拟机编写代码gcc编译过程gcc与g的区别Xftp连接虚拟机上传文件 安装GCC sudo apt install gcc g查看版本是7.5 touch test.c创建代码 但是在虚拟机中写代码很不方便 VScode远程连接到虚拟机编写代码 gcc test.c -o app在虚拟机中用gcc编译的…...

mac电脑设置chrome浏览器语言切换为日语英语等不生效问题

在chrome中设置了语言&#xff0c;并且已经置顶了&#xff0c;但是不生效&#xff0c;在windows上直接有设置当前语言为chrome显示语言&#xff0c;但是mac上没有。 解决办法 在系统里面有一个单独给chrome设置语言的&#xff1a; 单独给它设定成指定的语言&#xff0c;然后重…...

Python中的人工智能框架与实例

在人工智能(AI)领域&#xff0c;Python因其简洁的语法、丰富的库和强大的社区支持&#xff0c;成为了最受欢迎的编程语言之一。本文将详细介绍Python中的人工智能框架&#xff0c;并通过具体实例展示如何使用这些框架来实现不同的人工智能应用。 一、Python中的人工智能框架 …...

论文阅读(二十六):Dual Attention Network for Scene Segmentation

文章目录 1.Introduction3.DANet3.1Position Attention Module3.2Channel Attention Module 论文&#xff1a;Dual Attention Network for Scene Segmentation   论文链接&#xff1a;Dual Attention Network for Scene Segmentation   代码链接&#xff1a;Github 1.Intr…...

Stack和Queue(3)

Stack和Queue&#xff08;3&#xff09; priority_queue的模拟实现 priority_queue.h #include <vector>namespace soobin {template<class T, class Container vector<T>>class priority_queue{public://强制生成默认构造priority_queue() default;temp…...

怎样把学生的成绩单独告知家长?

期中考试季的到来让校园里的气氛似乎也变得紧张起来。家长们开始频繁地联系老师&#xff0c;希望了解孩子的表现&#xff1b;孩子们则在考试后&#xff0c;绞尽脑汁地想出各种理由&#xff0c;以期在成绩不理想时能减轻家长的失望。老师们更是忙得不可开交&#xff0c;不仅要批…...

vue3父组件控制子组件表单验证及获取子组件数值方法

1、关键部分的代码如下&#xff0c;我努力交代清楚了&#xff0c;希望能让大家看懂。 <template><KeepAlive><component ref"comp" :is"compNames[steps[compIndex].comp]" /></KeepAlive><el-button click"prevBtn"…...

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前&#xff0c;先介绍一个概念设计模式&#xff…...

Java.6--多态-设计模式-抽象父类-抽象方法

一、多态 1.定义--什么是多态&#xff1f; a.同一个父类的不同子类对象&#xff0c;在做同一行为的时候&#xff0c;有不同的表现形式&#xff0c;这就是多态。&#xff08;总结为&#xff1a;一个父类下的不同子类&#xff0c;同一行为&#xff0c;不同表现形式。&#xff0…...

JAVA Maven 的安装与配置

一、下载地址 官方网站&#xff1a;Maven – Download Apache Maven 我这里是3.8.6版本 二、安装步骤 maven安装之前要先安装jdk&#xff0c;请确保你的系统已经安装了jdk环境。 1.将下载好的 Maven 进行解压 apache-maven-3.6.8-bin.zip 2.配置本地仓库:修改 conf/settin…...

【程序分享】PCB元件坐标对齐工具 V1.3

↑↑↑点击上方蓝字&#xff0c;关注我们&#xff01; “PCB元件坐标对齐工具 V1.3”脚本程序在PCB文档中将元件的坐标自动移动到参考圆弧的中心&#xff0c;参考圆弧支持机械层1层和禁止布线层&#xff0c;参考图元的位置任意&#xff0c;不局限于栅格位置。 程序会自动…...

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…...

处理Hutool的Http工具上传大文件报OOM

程序环境 JDK版本&#xff1a; 1.8Hutool版本&#xff1a; 5.8.25 问题描述 客服端文件上传主要代码&#xff1a; HttpRequest httpRequest HttpUtil.createPost(FILE_UPLOAD_URL); Resource urlResource new UrlResource(url, fileName); httpRequest.form("file&q…...

transforms的使用

示例代码 from PIL import Image from torch.utils.tensorboard import SummaryWriter from torchvision import transforms#打开该图片 img_path"hymenoptera_data/val/bees/10870992_eebeeb3a12.jpg" imgImage.open(img_path) writerSummaryWriter("logs&quo…...

python-PyQt项目实战案例:制作一个视频播放器

文章目录 1. 关键问题描述2. 通过OpenCV读取视频/打开摄像头抓取视频3. 通过PyQt 中的 QTimer定时器实现视频播放4. PyQt 视频播放器实现代码参考文献 1. 关键问题描述 在前面的文章中已经分享了pyqt制作图像处理工具的文章&#xff0c;也知道pyqt通过使用label控件显示图像的…...

反向传播的微积分原理 | Chapter 4 | Deep Learning | 3Blue1Brown

目录 前言1. 简介2. 神经网络中的链式法则3. 微积分的计算4. 公式含义5. 代价函数对权重偏置的敏感度6. 多个神经元的情形7. 回顾相关资料结语 前言 3Blue1Brown 视频笔记&#xff0c;仅供自己参考 这个章节主要来深度讲解反向传播中的一些微积分理论 官网&#xff1a;https://…...

matlab读取excel表格

使用matlab读取excel表格中的数据 使用推荐代码读取excel表格中的数据 path "C:\Users\24975\Desktop\503\GUI展示案例\Tx_20_0_Rx_40_90_0.1_95_L.xlsx";%文件路径 data readtable(path,Sheet,Sheet1,ReadRowNames,false,ReadVariableNames,false&#xff0c;Ra…...

基于springboot+vue实现的助学兼职系统(源码+L文+ppt)4-092

基于springbootvue实现的助学兼职系统&#xff08;源码L文ppt&#xff09;4-092 第4章 系统设计 4.1 总体功能设计 一般学生、招聘公司和管理者都需要登录才能进入助学兼职系统&#xff0c;使用者登录时会在后台判断使用的权限类型&#xff0c;包括一般使用者和管理者,一般使…...

⌈ 传知代码 ⌋ 农作物病害分类(Web端实现)

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

CMU生成式人工智能大模型:从入门到放弃(九)

引言 在前面的系列博客中&#xff0c;我们深入探讨了生成式对抗网络&#xff08;GANs&#xff09;和变分自编码器&#xff08;VAEs&#xff09;等生成式模型。今天&#xff0c;我们将探索扩散模型&#xff08;Diffusion Models&#xff09;的进一步应用&#xff0c;并讨论在上…...

HTML基础总结

一、简介 HTML&#xff08;HyperText Markup Language&#xff09;即超文本标记语言&#xff0c;是用于创建网页的标准标记语言。它通过使用各种标签来定义网页的结构和内容&#xff0c;告诉浏览器如何显示网页。HTML 文档由标签和文本组成&#xff0c;标签用于描述文本的性质…...

EXCELL中如何两条线画入一张图中,标记坐标轴标题?

1&#xff0c;打开excel&#xff0c;左击选中两列&#xff0c; 2&#xff0c;菜单栏>“插入”>”二维折线图”选中一个 3&#xff0c;选中出现的两条线中的一条右击>最下一行&#xff0c;“设置数据系列格式” 4&#xff0c;右测“系列选项中”>点击“次坐标轴” 5…...

学校开发网站公司/百度搜索开放平台

每个人都会有缺点和不足&#xff0c;作为管理者&#xff0c;如果总想改造属下员工&#xff0c;这是一种不切实际的做法&#xff0c;因为每个人都是一个有思想的个体&#xff0c;只能由内而外的改变。每个人都有其用武之地&#xff0c;项目经理与其费尽心力改造员工&#xff0c;…...

wordpress的子主题/网站推广公司黄页

独热编码即 One-Hot 编码&#xff0c;又称一位有效编码&#xff0c;其方法是使用N位状态寄存器来对N个状态进行编码&#xff0c;每个状态都有它独立的寄存器位&#xff0c;并且在任意时候&#xff0c;其中只有一位有效。 一、问题由来 在机器学习算法中&#xff0c;我们经常会…...

wordpress自定义文章参数/全网营销推广

打开我的电脑-管理-事件查看器--应用程序&#xff0c;右键-----正常登-“清除所有事件”&#xff0c;重启ORACLE服务&#xff0c;数据库可以正常登录&#xff0c;问题解决&#xff01;&#xff01;&#xff01;...

angular做门户网站/中国站长之家官网

在我的代码中,我取两个数据系列的对数并绘制它们.我想通过将x轴的每个刻度值提高为e(自然对数的反对数)来改变每个刻度值.换一种说法.我想绘制两个系列的对数,但是具有x轴的水平.这是我正在使用的代码.from pylab import scatterimport pylabimport matplotlib.pyplot as pltim…...

微网站和微信公共平台的区别/广告优化师的工作内容

Linux是什么&#xff1f;linux是一个开源操作系统&#xff0c;是用于与计算机硬件打交道的中间层。操作系统管理系统资源&#xff0c;提供最基本的计算功能&#xff0c;如管理及配置内存&#xff0c;同时还提供一些基本的服务程序&#xff0c;如&#xff1a;文件系统、设备驱动…...

免费1级做爰片在线观看 历史网站/seo流量的提升的软件

Windows系统是迄今为止使用频率最高的操作系统&#xff0c;虽然其安全性随着版本的更新不断提高&#xff0c;但由于人为编写的缘故始终存在漏洞和缺陷。但Mircosoft公司通过发布漏洞补丁来提高系统的安全性&#xff0c;使Windows系统不再被攻破。因此&#xff0c;用户不仅需了解…...