通俗易懂MVP模式

MVP架构模式详解 MVP(Model-View-Presenter)架构通过将应用程序分为三个主要组件,实现了关注点分离,提高了代码的可维护性、可测试性和可读性。它特别适用于需要清晰结构和高测试覆盖率的中大型应用程序。虽然MVP架构存在一些挑战,如代码量增加、学习曲线和潜在的Presenter膨胀问题,但通过遵循最佳实践和合理规划,这些问题可以得到有效缓解。随着技术的发展,MVP也在不断演进,与新的技术和模式结合,继续发挥其价值。 阅读详情

在这里讲mvp模式的前提是需要大家有点接口回调的基础,也就是你懂得怎么回调接口,定义接口,理解接口。毕竟接口是解耦的利器哟,java的基础很重要~~

  1. 平常大部分人用的开发模式应该是mvc模式,相信大家对mvc模式也应该比较了解,在这里再唠叨一下其中的每个角色:m:通常我们是指数据模型和实体类,v:view通常指的是xml和页面显示的控件,而c:控制层则是指”万能的Activity”。
    这里写图片描述
  2. 在上面为什么要说activity是万能的呢?因为我相信大家应该多多少少能够猜到,没错,在activity中布局文件中的数据绑定的操作,事件处理的代码都在activity中,造成了activity既像view又像controller,想想,其中的代码是不是动辄就得上百上千行代码,这就造成了activity里面的代码很繁杂臃肿,感觉啥都有activity来参与,代码混乱,思路完全混乱,而且这也跟android的设计思想—低耦合相悖,所以mvp应运而生了。
    这里写图片描述
  3. 再来说说mvp的模式。为啥它一出来就收到很多人的热捧?其实,只要有一点的架构思想都能感觉的到其中的妙处,没有的话,那就多多体会其中代码的逻辑的清晰都,总会有点那种感觉;再说说里面的角色,v:activity页面或者fragment,m:没变还是model数据业务和实体,p:presenter,它其实是v和m层的中间者,其实我私底下认为它就是翻译者。这里现在不理解没事,接下来慢慢讲解。
  4. 接下来理解mvp其中的关系,不会有太多的生涩的字词,请先看图
    这里写图片描述

我们能看到上面的是mvp的三者关系,其中view跟presenter是有双方通信的(看箭头),而model和presenter直接只有presenter持有model(箭头是单向的),那数据是如何传给presenter的呢,这就是上面开头说到的接口了,它通过接口回调的形式将数据库访问的结果或网络请求的结果返回给presenter,而p因为同时持有了view,所以将数据有传给了view,最终数据到了view层就非常easy了,直接update就好了。

  1. 接下来就开始撸代码了,代码非常easy,都能看得懂。
  2. 首先请看代码结构
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.sinodata.mvp.MainActivity">

    <TextView
        android:id="@+id/tvMsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>

    <ProgressBar
        android:id="@+id/pb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility="gone"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:onClick="loadData"
        android:text="加载数据"/>
</RelativeLayout>

这里写图片描述

这里就是简单的一个button和一个textview,点击button将模拟数据请求,放在textview显示。

再看看包结构:
这里写图片描述
非常清晰,网络数据请求都到了model层了,view层只要定义好怎么显示看下这三层各个代码结构:

IModel层:

package com.sinodata.mvp.com.sinodata.mvp.view;

/**
 * Created by Administrator on 2016/11/1.
 */

public interface IView {

    void showMessage(String content);

    void showDialog();

    void hideDialog();
}

接着看model层的接口:

package com.sinodata.mvp.com.sinodata.mvp.model;

/**
 * Created by Administrator on 2016/11/1.
 * <p>
 * model
 * 请求网络数据业务模型
 */

public interface IModel {
    void getMessage(ModelCallBack mCallBack);
}

这里定义了一个callBack用于回调网络数据结果给Presenter
Model的实现类代码:

package com.sinodata.mvp.com.sinodata.mvp.model;

import java.util.Random;

/**
 * Created by Administrator on 2016/11/1.
 * 业务实现类 正式加载网络数据业务
 */

public class ModelImp implements IModel {
    @Override
    public void getMessage(final ModelCallBack mCallBack) {
        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    //模拟网络请求
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Random r = new Random();
                r.nextInt(1000);
                //将数据通过接口回调给presenter层
                mCallBack.getData("MVP:我是来自model业务层网络加载的数据 " + r);

            }
        }.start();

    }
}

最后看看Presenter接口:

package com.sinodata.mvp.com.sinodata.mvp.presenter;

/**
 * Created by Administrator on 2016/11/1.
 */

public interface IPresenter {

    void loading();
}

这里就一个方法,用于到Activity中调用
接着看实现类Presenter:

package com.sinodata.mvp.com.sinodata.mvp.presenter;

import com.sinodata.mvp.com.sinodata.mvp.model.IModel;
import com.sinodata.mvp.com.sinodata.mvp.model.ModelCallBack;
import com.sinodata.mvp.com.sinodata.mvp.model.ModelImp;
import com.sinodata.mvp.com.sinodata.mvp.view.IView;

/**
 * Created by Administrator on 2016/11/1.
 * <p>
 * 中间翻译者 同时持有view和model
 */

public class Presenter implements IPresenter {
    private IModel mModel;
    private IView mIView;

    public Presenter(IView IView) {
        mIView = IView;
        mModel = new ModelImp();
    }

    @Override
    public void loading() {

        mIView.showDialog();
        mModel.getMessage(new ModelCallBack() {
            @Override
            public void getData(String content) {
                //在这里Presenter将数据开始传给了view层了
                mIView.showMessage(content);

                mIView.hideDialog();
            }
        });

    }
}

最后还差一点就大功告成了,就是activity的实现IView接口:

package com.sinodata.mvp;

import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.sinodata.mvp.com.sinodata.mvp.presenter.IPresenter;
import com.sinodata.mvp.com.sinodata.mvp.presenter.Presenter;
import com.sinodata.mvp.com.sinodata.mvp.view.IView;


public class MainActivity extends AppCompatActivity implements IView {
    private TextView mTextView;
    private IPresenter mIPresenter;
    private ProgressBar pb;

    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.tvMsg);
        pb = (ProgressBar) findViewById(R.id.pb);
        pb.setKeepScreenOn(true);
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setCanceledOnTouchOutside(false);
                //这里初始化presenter
                mIPresenter = new Presenter(this);
    }

    public void loadData(View view) {
        mIPresenter.loading();

    }

    @Override
    public void showMessage(final String content) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mTextView.setText(content);
            }
        });

    }

    @Override
    public void showDialog() {
        //这里可以模拟弹出一个加载框

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mProgressDialog.show();
            }
        });
    }

    @Override
    public void hideDialog() {
        //
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mProgressDialog.hide();
            }
        });

    }
}

好了代码里面的注释基本解释的清楚了,运行效果截图如下:

点击按钮button:
这里写图片描述

加载完数据效果如下:

这里写图片描述

是不是很easy?!!其实这是mvp最最简单的用法,里面还有很多需要完善的地方,比如,view的移除,生命周期控制等等,不过作为mvp模式的入门还是够得,本人也是对这个mvp模式研究没多久,但是很喜欢这种思想,后面会慢慢研究这个模式的思想,然后把博文发给大家看看,一起学习学习。

产品经理必备:MVP 模式的价值与运用 在当今竞争激烈的商业世界中,产品经理的角色至关重要。他们不仅要把握市场趋势,还需精准洞察用户需求,而掌握 MVP(Minimum Viable Product,最小可行产品)模式,对于产品经理来说更是如虎添翼 阅读详情

相关推荐

Android面试必问!啃完999页Android面试高频宝典,完整PDF

前言 首先介绍一下自己,计算机水本,考研与我无缘。之前在帝都某公司算法部实习,公司算大公司吧,然而个人爱好偏开发,大二的时候写个一个app,主要是用各种框架。 1. Android架构设计模式 MVC架构设计模式:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。 MVP架构设计模式:MVC全名是Model View Persenter,MVP由MVC演变而来,是现在主流的开发模式。 MVVM架构设计模式:MVVM全名是M

m0_52308677的博客 705

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

什么是MVP: MVP 是 MVC 的变种,其实是一种升级。要说 MVP 就要说说 MVC,在 MVC 中 Activity 其实是 View层级,但是通常在使用中 Activity即是View也是Controller,并没有将 View层 和 Controller层 进行分离, 耦合度大大提高,非常不利于项目的管理。这时候 MVP 就应运而生了。 MVP分为三层 Model View Prese...

weixin_42814000的博客 3916

5分钟搞定CST周期性结构仿真:共面波导色散曲线快速生成技巧

本文提供了一套在CST Studio Suite中快速仿真周期性结构并生成色散曲线的标准化流程。针对共面波导设计,重点解析了周期性边界条件的核心设置、本征模求解器(JDM算法)的优化技巧,以及通过参数扫描与后处理模板实现自动化,旨在帮助射频与微波工程师在5分钟内高效完成关键性能验证。

blue的专栏 1248

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

为什么用AndroidMVP 设计模式?当项目越来越庞大、复杂,参与的研发人员越来越多的时候,MVP 模式的优势就充分显示出来了。 MVP 模式是 MVC 模式在 Android 上的一种变体,要介绍 MVP 就得先介绍 MVC。在 MVC 模式中,Activity 应该是属于 View 这一层。而实质上,它既承担了 View,同时也包含一些...

diaodishui8923的博客 297

Unity FPS射击控制系统:数据驱动的武器行为解耦方案

在Unity第一人称射击(FPS)开发中,射击系统常因输入、状态、行为耦合导致连发异常、换弹冲突与网络同步失准。其本质是缺乏对‘武器行为’(如后坐力曲线、弹药逻辑)与‘射击控制’(如输入合法性校验、冷却调度)的正交分离。本方案基于ScriptableObject实现WeaponData数据资产化,配合ShootingController状态机服务,达成输入解耦、运行时参数可调、协程受控、网络预测友好等工程目标。适用于中大型FPS项目架构升级与数据驱动转型,尤其解决Unity InputSystem与物理反馈

weixin_30536861的博客 610

C#实现不占用串口的串口监听与侦听技术:高效监控串口数据的最佳实践

本文详细介绍了如何实现不占用串口的串口监听与侦听技术,解决了传统串口监听可能带来的串口占用问题。通过使用虚拟串口、外部监听工具或第三方库,我们可以高效地实现串口数据的捕获与处理,适用于各种工业控制、物联网和嵌入式开发的应用场景。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1675

通俗易懂系列之Android中的MVP设计模式

说起MVP设计模式,做开发的可能都不会陌生,多少都会有点自己对它的理解。那么本篇博客就记录一下我对它的理解。 其实,从一开始我有点不理解为什么要有设计模式这种东西和为什么要去用它。如果说为什么要有设计模式,这个很好解决,设计模式可以让我们的软件更容易维护扩展,使代码之间的关系变得更加清晰。那么为什么要用它呢?本来一个Activity就可以解决的问题,竟然要额外写那么多接口和类,MVP三者之间这个...

Ever69的博客 743

算法基础之数组双指针(Leetcode题型归纳)

数组双指针(Leetcode题型归纳)1.前言2.双指针基础3.相向双指针3.1定义3.2真题分析3.2.1两数之和(1)3.2.2两数之和-输入有序数组(167)3.2.3三数之和(15)3.2.4最接近的三数之和(16)3.2.5四数之和(18)3.2.6盛最多水的容器(11)3.2.7有效三角形的个数(611)4.同向双指针-快慢指针4.1定义4.2真题分析4.1.1删除排序数组中的重复项(26)4.1.2移除元素(27)4.1.3删除排序数组中的重复项(80)4.1.4移动零(283)4.1.5数组

Buluchacha的博客 1034

python工厂模式 简书_为什么学习JavaScript设计模式,因为它是核心

那么什么是设计模式呢?当我们在玩游戏的时候,我们会去追求如何最快地通过,去追求获得已什么高效率的操作获得最好的奖品;下班回家,我们打开手机app查询最便捷的路线去坐车;叫外卖时候,也会找附近最近又实惠又好吃的餐厅叫餐。我们总时会想法设法的追求最便捷的解决方法,最佳实践。设计模式是什么呢?它就是武功秘籍里面的招式,是前辈总结出来的最佳实践,遇到不同的场景都有相应的招式得以施展,让敌人落荒而逃,让复杂...

weixin_42358827的博客 138

Autosar_MCAL_Port

PORT Driver就是对微控制器(MCU)的整个PORT模块进行初始化配置。很多端口和管脚被分配有多种不同的功能,即可以进行引脚功能复用,比如通用I/O、adc、pwm、spi等功能。因此,对PORT必须有一个整体的配置和初始化,对各管脚的具体配置和使用取决于微控制器和ECU的引脚功能分配。PORT初始化数据应当尽可能高效地写到每个端口。DIO驱动中所用到的端口的配置和初始化都是在PORT驱动模块中完成的。因此,在使用DIO功能之前,应先进行PORT的初始化。1、PortContainer说明。

不断debug,优化中…… 239

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

MVP模式

u012588160的博客 183

5步VS传统WinForm!AntdUI让界面设计从“土味”到“超模”只需30秒?

摘要:墨瑾轩编程教程《AntdUI的5大魔法步骤》详解如何将传统WinForm升级为现代化UI。教程通过5个核心步骤:安装AntdUI库、控件替换、主题定制、复杂布局构建及实战案例演示,对比传统开发与AntdUI在美观度(动态阴影/动画)、开发效率(拖拽组件VS手工绘制)和主题定制(一键换肤VS重写控件)的显著差异。使用C#代码示例展示按钮动画、3D翻转、聊天界面等特效实现,帮助开发者快速掌握这一基于Ant Design风格的WinForm增强框架。(150字)

java专栏 1129

讲Android mvp模式的书,[包教包会]Android之MVP模式

本文适用读者:已经熟练掌握Android编程但没学过MVP模式的程序员。说起MVP模式,我也看过好多相关文章了。可是看完之后,甚至照着例子敲了一遍代码之后,还是没看懂。之懵懂的记得有Model,View,Presenter,Presenter和Model交互数据,然后Presenter控制Activity里面的View显示。在一番努力之后,我终于自认为学会了MVP模式。网上竟然没有一篇通俗易懂的文...

weixin_42501904的博客 171

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

从github上的优秀实例看MVP模式

github上有一个关于MVP模式学习的实例https://github.com/antoniolg/androidmvp,虽然只有简单的几个类,却收获了几千个星。这个例子确实通俗易懂,直观的体现出了MVP模式的特点: 考虑这样一个需求,页面显示一个列表,数据源需要特别获取。 分析一下这个过程,页面首先显示出进度提示框表示正在加载,然后数据源获取数据并传给页面的列表进行渲染。 MVP

zhang___yong的博客 2619

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android MVP with Fragment and RecyclerView

最近刚刚接触MVP模式,试着做一下笔记。关于MVP模式网上关于MVP模式的资料已经很多了,看了几篇介绍的,个人觉得Android MVP模式 简单易懂的介绍方式这篇讲得最通俗易懂了,而且也考虑到了很多方面。这里就不再赘述了。MVP demo网上大多数的博客给的demo都挺简单的,所以我想写一个稍微复杂点的demo,主要用到了Fragment和RecyclerView。主要是参考了github上的Re

Make a difference 3563

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

通俗易懂带你理解mvc、mvp以及mvvm的区别

在web开发中,经常会听过mvc,mvp,mvvm几个概念,那么他们究竟是什么?在网站制作中,如果理解他们的不同作用及优势?今天,我们最通俗易懂的文字带大家了解下(这里我们仅针对web开发为例,不介绍应用程序等)。 mvp以及mvvm的区别 MVC、MVP、MVVM的工作背景介绍在一个网站运行过程中,会涉及到网站的具体工作流程,他们的基本工作原理为:在数据库获取信息,后台编程语言通过对数据进行处理渲染,最终呈现在浏览器界面中。后来为了网站能更好的运行及后期网站维护管理,随着互联网技术的革新,..

u010227042的博客 914

Dagger2使用——结合MVP模式讲解

更新:根据Dagger2官方最新配置,现在配置已经不需要添加android-apt插件了,所以配置更简单了。即在下文中说的Dagger2配置的第一步与第二步都可以省略了,第三步直接改成以下即可)。 /*dagger2的配置*/ annotationProcessor 'com.google.dagger:dagger-compiler:2.4' compile 'c

wildma的博客 1385

带你通俗易懂的理解——Android中的MVC与MVP

首先介绍一下所谓的MVP,美国职业篮球联赛最有价值球员奖(National Basketball Association Most Valuable Player Award ,简称MVP)是一个自1955-1956赛季以来每年对美国职业篮球联赛(NBA)常规赛中全场表现最佳的球员所颁发的一个奖项。

wildma的博客 1120

Android MVP实战

前言前些天,在公司实习的测试妹纸回学校答辩了,要我给她做个毕业设计,说要求不高,看看界面就行。七搞八搞给做了个,但是项目一开始并不是用mvp写的,因为那时感觉对mvp的理解还不是很深刻。前两天有空,就把它改成了mvp风格的样子,所以也就有了这篇博客。网上也有很多文章跟demo,初看时始终不得其解,后来在将那个项目改成mvp的过程中才开始有了拨云见月的感觉,这篇博客也将尽可能用通俗易懂的语言来帮助更多

金克丝的美好初衷 1804

MVC,MVP,MVVM的区别

看了很多版本的讲解让我越来越糊涂,最后总结还是阮一峰老师的比较生动容易理解 (不过我看了看 老师文章的评论下面也有很多跟我一样很多不同的看法) MVC 很多框bai架都是以方便实现MVC模式而设计的,比du如Struts,spring。 在阮一峰老师的文章里看来 MVC是单向的 也就是我们可以通过视图对页面进行控制,当进行一些逻辑时通过控制器来将模型部分的数据改变 也就是这样 当然也可以是这样 直接通过控制器控制 MVP 关于MVP老师就讲得很通俗易懂了 这里我直接将老师讲的搬过来 MVV

Edasi的博客 300

ASP.NET WebForm MVP(三)- MVP模式应用总结

通过前面两篇文章,对MVP的基本概念以及简单的应用都有相应的介绍,那么接下来就主要总结一下这一年左右在ASP.NET WebForm中应用MVP模式的一些体会,很多东西看起来的确很美好,但当实际应用的时候往往还有很多问题需要考虑。 实践资料 把这点放在最前面,不是说MVP模式的资料少,随便搜一下还是有很多信息,但别开心太早,仔细看看这些资料就知道为啥我会这样说了,绝大部分都是在讲MVP模式的基...

weixin_30575309的博客 126

Android开发-通过通俗易懂的Demo让你理解Android中MVC架构和MVP架构

相信从事软件开发的伙计们肯定熟悉或者听说过项目架构,比如要新开发一个APP或者Web项目,首先考虑的就是项目需要设计什么样的架构,MVC还是MVP呢?MVC和MVP具体是怎么体现的,有哪些优点,哪些缺点呢?

Mango先生的博客 2428

认清Android框架 MVC,MVP和MVVM

认清Android框架 MVC,MVP和MVVM

qq_43685172的博客 190
上一篇: MySQL 链接eclipse
下一篇: RxJava的入门和精通
RayXiong
博客等级 码龄10年 8粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值