Android开发之MVP模式

article/2025/9/23 1:57:59

前言:在之前的开发中一直用的是mvc模式搭建的项目,所以我对于mvp也一直只是停留在理论和demo阶段上。正好现在的项目是被小伙伴借助dragger搭建的mvp模式的结构,所以就想着总结整理一下mvp模式的东西并写出来,也算是作为自己使用了mvp模式的标志。本文会先简单介绍一下几个常用的项目搭建模式,当然侧重点还是后面的mvp详解。

常用的几个模式:MVC、MVP、MVVM

MVC

对于MVC我想大家应该都不陌生,最典型的MVC就是JSP + servlet + javabean的模式了。

上面两张图是我从别的文章copy的,从中很容易看出MVC的大致流程,用户通过操作View来发送用户请求;Controller接收到 用户请求 后,负责决定应该调用哪个Model来进行处理;然后Model根据用户请求进行相应的业务逻辑处理,并返回数据;最后Controller调用相应的视图View来显示Model返回的数据。

MVVM

看上面的图(当然也是copy的),在MVVM中有个ViewModel,它的作用就是与View进行双向绑定,当View或者ViewModel有一方变动时,另一方也会跟着改变,其实就是观察者模式,同时ViewModel也会处理一些轻量的业务逻辑,具有和MVP中的Presenter的一些类似功能。当用户对View进行操作时,ViewModel就会直接收到指令,然后调用Model处理业务逻辑,当Model返回数据给ViewModel时,因为ViewModelView双向绑定的缘故,ViewModel接收到数据后,View也会跟着改变,省去了ViewModel特意调用View来改变View的状态这一步骤!

MVP

首先,我们来看一下上图,View发送指令给PresenterPresenter获取指令后,调用响应的Model进行业务逻辑处理,然后返回数据给PresenterPresenter根据Model返回的数据再来调用相应的View

为什么要用MVP?

在android开发中,相信大家应该都熟悉了mvc(model 、 view 、 control)。在Android的架构中Activity,fragment,布局的xml相当于View。然而在实际的开发过程中,Android的View层任务太繁重,大家将V和C都糅杂在Activity、Fragment中,这就导致了在实际开发中View层太过累赘,一不小,几次代码迭代过后,一个Activity或者Fragment中的代码就有几千行,有时候修改个功能在笨重的代码中摸爬滚打半天才找到关键点,对于不熟悉代码的开发者来说(或者前人编写代码质量太低)那代码迭代接手后简直是妙不可言。所以将视图和业务逻辑代码分开势在必行。

基于这个现状,Google设计了一个更优的框架模式来解决这个问题。就是目前实际开发中火热的MVP模式(model 、 view 、presenter)。用presenter将model和view隔离开来,一切业务逻辑处理都是通过presenter来进行操作,也就是说presenter是视图的数据的桥梁,视图和数据相隔两端,“可远观而不可亵玩”。强制只能使用presenter作为“邮递员”来”通信“。

MVP与MVC最大的不同之处是,MVP将M与V分隔开来,通过P交互,这样在Android中,就可以明确的把Activity当作View处理,虽然可能还有一点逻辑在其中,但是已经无伤大雅;View和Model不直接交互,当View有变动或者Model有变动时,不会相互影响,有太大变动,,耦合性低,对于后期维护来说,特别是项目越来越庞大时,可以很快的理清项目结构,找到需要修改的地方,大大的缩短了工作量。而且,因为View与Model分离的缘故,Model可以单独进行单元测试。

MVP代码结构

首先是View和presenter的接口,抽象出view对象的绑定方法。

IView.java

public interface IView {void bindView();void UnbindView();}

IPresenter.java

public interface IPresenter {void register(V view);void unRegister();}

BasePresenter实现IPresenter接口,为业务逻辑层presenter的基类。用弱引用来接收View的对象,在取消注册的时候销毁view对象,保证View不会造成内存泄漏。

BasePresenter.java

public class BasePresenter implements IPresenter {protected WeakReference iView;@Override
public void register(V view) {Log.i(TAG, "BasePresenter register: ");iView = new WeakReference(view);
}@Override
public void unRegister() {Log.i(TAG, "BasePresenter unRegister: ");iView.clear();iView = null;
}

BaseActivity实现IView接口,为视图层的基类(也就是Activity的基类),这是一个抽象类,实现了视图层到业务逻辑层的绑定与解绑,抽象方法createPresenter()子类必须实现,来确保不通的业务逻辑层。

BaseActivity.java

public abstract class BaseActivityextends Activity implements IView{protected P iPresenter;@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);bindView();
}@Override
protected void onDestroy() {super.onDestroy();UnbindView();
}@Override
public void bindView() {iPresenter = createPresenter();iPresenter.register(this);
}@Override
public void UnbindView() {iPresenter.unRegister();
}protected abstract P createPresenter();}

接下来是具体的使用MVP的流程了,定义三方交接接口。

public interface DemoContract {interface View{void demoView(String test);}interface Presenter{void demoPresenter();}interface Model{void demoModel(ModelListener modelListener);interface ModelListener{void completed(String test);}}

视图层DemoActivity.java继承BaseAcitivity实现createPresenter()方法,DemoContract.View接口。

public class DemoActivity extends BaseActivity implements DemoContract.View {@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iPresenter.demoPresenter();
}@Override
protected DemoPresenter createPresenter() {return new DemoPresenter();
}@Override
public void demoView(String test) {Toast.makeText(this, test, Toast.LENGTH_LONG).show();}

业务逻辑层DemoPresenter.java继承BasePresenter实现DemoContract.Presenter接口。

public class DemoPresenter extends BasePresenter implements DemoContract.Presenter {DemoContract.Model model = new DemoModel();@Override
public void demoPresenter() {model.demoModel(new DemoContract.Model.ModelListener() {@Overridepublic void completed(String test) {iView.get().demoView(test);}});
}

数据实体层DemoModel.java实现DemoContract.Model接口,用接口回调异步返回数据。

public class DemoModel implements DemoContract.Model{@Override
public void demoModel(ModelListener modelListener) {modelListener.completed("mvp test");
}

到此为止,上面的代码流程就是我使用mvp的方式,当然了使用流程不是固定的,每个人都可以根据自己的风格和喜好进行变形什么的。

MVP优缺点

优点:最大的优点剥离了视图层和业务逻辑层,让各个类的分工更为明确,逻辑更为清晰,代码扩展性更高,后期代码迭代更新更加容易,同时也方便了单元测试的编写,以前将视图与业务混合在一起的时候,要写单元测试很多时候真的是无从下手。相对于MVP模式来说写单元测试就更加容易了。因为职责更加清晰,测试的目标就明确多了。

缺点:相对而言,MVP模式的代码量就多了,类文件也多了,简单的一个业务逻辑操作就要各方来配合协作(即是需要presenter 和 view的接口)。但是这个问题完全在可以接收的范围。完全符合Java的抽象封装设计原则(接口隔离,开闭原则,里氏代换)。

可能存在的问题:Model进行一步操作的时候,获取结果通过Presenter会传到View的时候,出现View引用的空指针异常。Presenter和View相互持有引用,解除不及时的话容易出现内存泄漏。

好了,文章到此结束了,希望对你有所帮助,see you

 


http://chatgpt.dhexx.cn/article/EXiLWdKp.shtml

相关文章

MVP模式与MVC模式

源地址:http://www.cnblogs.com/cuihongyu3503319/archive/2009/01/09/1372820.html MVP模式与MVC模式(转) MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据&#x…

MVP模式从入门到精通

首先附上自己写的一个MVP的demo,这是一个很标准的MVP,Github地址如下: https://github.com/SilasGao/MVPDemo 首先MVP 是从经典的MVC架构演变而来,那我们是不是要先说下何为MVC模式? 系统C/S(Client/Server)三层架构模…

MVP模式使用示例详解

什么是MVP模式? 这个MVP可不是腾讯游戏《王者荣耀》中的MVP。我们今天要讨论的MVP其实同MVC一样,是一种编程模式和思想,也许更准确地讲是一种架构。 MVP和MVC的区别 提到MVP模式,大家自然避免不了要和我们以前常用的MVC模式进行对…

MVP设计模式

Model–view–presenter (MVP) 是model–view–controller (MVC)设计模式派生出来的。MVP经常用来创建用户界面。 presenter是作为一个“中间人”的角色存在。在MVP中,所有页面显示逻辑都会被推送到presenter。 以下这张图是MVC模式的: MVP与MVC有着一…

Android中用到的MVP模式

参考:android架构设计—mvp模式封装 很简单,M:数据, V:界面, P:一个使唤数据(M)和界面(V)干活的大管家。 特点:在P的管理下,P可以直接支配V和M做一些事情。但是V,与M,你…

Android MVP模式 简单易懂的介绍方式

Android MVP Pattern Android MVP 模式1 也不是什么新鲜的东西了,我在自己的项目里也普遍地使用了这个设计模式。当项目越来越庞大、复杂,参与的研发人员越来越多的时候,MVP 模式的优势就充分显示出来了。 导读:MVP模式是MVC模式在…

Android MVP模式详解

一、MVP概述 MVP,全称 Model-View-Presenter,即模型-视图-层现器。 提到MVP,就必须要先介绍一下它的前辈MVC,因为MVP正是基于MVC的基础发展而来的。两个之间的关系也是源远流长。 MVC,全称Model-View-Controller&am…

浅谈安卓MVP模式

本篇博文通过对google官方demo:https://github.com/googlesamples/android-architecture/tree/todo-mvp/的理解,用自己的demo更好的讲解mvp的概念,帮助大家如何针对一个Activity页面去编写针对MVP风格的代码。 一、MVP模式介绍 随着UI创建技…

简单易懂 MVP 模式

Android MVP 模式 [1] 也不是什么新鲜的东西了,我在自己的项目里也普遍地使用了这个设计模式。当项目越来越庞大、复杂,参与的研发人员越来越多的时候,MVP 模式 的优势就充分显示出来了。 MVP 模式是 MVC 模式在 Android 上的一种变体&#…

深入浅出——MVP模式

由于公司里的架构模式用到MVP,觉得自己还不够熟悉,决定在此理一理,并给大家一起总结下。 一 MVP模式介绍 MVP全称Model View Presenter。 MVP能够有效的降低View的复杂性,避免业务逻辑被塞进View中,防止View的代码变…

MVP模式简单讲解,通俗易懂

了解 MVP 和 MVC 的区别 https://baike.baidu.com/item/MVP/3714550?fraladdin 什么是MVP: MVP 是 MVC 的变种,其实是一种升级。要说 MVP 就要说说 MVC,在 MVC 中 Activity 其实是 View层级,但是通常在使用中 Activity即是View…

MVP框架模式

一、基本概念 MVP是Model-View-Presenter的简称,即模型-视图-表现层的缩写。MVP是由MVC模式进化而来的,MVP改进了MVC中的控制器过于臃肿的问题。 与MVC一样,MVP将应用程序的数据处理、数据显示和逻辑控制分开,用一种业务逻辑、数…

分析几个面试题:==和===;绑定事件;正则表达式

今天也是我学后端的朋友给我发了三个前端的面试题,这里我们试着分析一波。 目录 1、和的含义是什么,又有什么区别呢? (1)赋值: (2)相同: (3)…

前端面经总结

HTML及浏览器 对栅栏布局的理解 栅格化布局中的元素:column列,row行,gutter列之间的距离,container容器 栅格是否可以嵌套 canvas和svg的区别 SVG: SVG 是一种使用 XML 描述 2D 图形的语言。 在 SVG 中,…

前端深入学习

但是面试中必考的点且占比非常大的有前端基础和算法。 决定你是否能拿sp offer(高薪offer)以及是否进名企的是项目和算法。 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。 元素的位置通过 “left”, “to…

web前端常用词汇

html中的单词 Network [netwɜːk] 网络 General [dʒen(ə)r(ə)l] 一般的,大体的 Request [rɪkwest] 请求 Response [rɪspɒns] 响应 Headers [hedəz] 标题 HyperText [haɪpətekst] 超文本 Transfer [trnsfɝ] 传递 Protocol [prəʊtə…

前端html、css、JavaScript---硬核知识汇总

前端HTML篇 硬核!一篇文章教你阅遍html。 声明:本篇文章只是一个刚开始学习后端开发的菜鸟汇总完成的 JavaWeb学习前导html篇,所以专业性肯定不如前端人员,但用于学习后端开发足够了,刚接触html的童鞋拿来快速了解ht…

前端面试题总结(转载)

DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动1.DOM中两个节点存在的关系无非3种:1.1.包含与被包含,IE率先引入的contains()方法可检测,例 A.contains(B),即检查节点B是否是节点A的子节点,返回布尔值&…

前端三件套知识点

html 常用插件 文件比较 常用快捷键 ctrl f 查找当前页面的内容 !后按table 或者 html:5 代码模板快捷键 altb调试快捷键 ctrlk ctrlt改颜色主题 altshifta注释快捷键 html基础概念 一、 WEB标准的概念及组成 WEB标准不是某一个标准,而是一系列标准的集合。 …

php前端搜索功能,JavaScript实现前端实时搜索功能的代码分享(图)

这篇文章主要为大家详细介绍了JavaScript实现前端实时搜索功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 大部分页面都具备搜索功能。而作为前端,我们的目的只是将用户输入的内容返回给后台而后呈现反馈数据给用户,具体实…