MVP架构的概念

MVP(Model-View-Presenter)是从经典的模式MVC演变而来的,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

View: 对应于Activity,负责View的绘制以及与用户交互
Model: 依然是业务逻辑和实体模型
Presenter: 负责完成View于Model间的交互

View不直接与Model交互,而是通过与Presenter交互来与Model间接交互。
Presenter与View的交互是通过接口来进行的。
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。

MVP架构模式的简单实践

Version实体类

public class Version implements Serializable{//是否有新版本private String hasNewVersion;//新版本名private String versionName;//最新版本号private String versionCode;public void setHasNewVersion(String hasNewVersion) {this.hasNewVersion = hasNewVersion;}public String getHasNewVersion() {return hasNewVersion;}public String getVersionName() {return versionName;}public void setVersionName(String versionName) {this.versionName = versionName;}public String getVersionCode() {return versionCode;}public void setVersionCode(String versionCode) {this.versionCode = versionCode;}
}

主界面有两个TextView,一个用于显示版本名,一个用于显示版本号,还有一个按钮,点击按钮会触发请求,代码如下:

public class MvpActivity extends AppCompatActivity implements VersionView {private TextView versionName;private TextView versionCode;private VersionPresenter mVersionPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_mvp);versionName = (TextView) findViewById(R.id.version_name);versionCode = (TextView) findViewById(R.id.version_code);mVersionPresenter = VersionPresenter.getInstance(this);findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mVersionPresenter.getNewVersion(getApplicationContext(), "local-url");}});}@Overridepublic void showVersionNameAndDesc(Version version) {versionName.setText("最新版本名:" + version.getVersionName());versionCode.setText("最新版本号:" + version.getVersionCode());}@Overridepublic void showToast(String msg) {Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();}
}

该Activity实现了VersionView接口,这就是mvp中的view层,用于跟用户交互,显示数据。我们可以看到VersionPresenter的初始化,VersionPresenter属于presenter层,用于处理view与model层的通信,不让view直接操作model,可见用户点击按钮后,就通知VersionPresenter去获取版本信息,至于如何获取版本信息,presenter层会交给对应的model去进行处理,下面是VersionPresenter的代码:

public class VersionPresenter extends IPresenter {private static VersionPresenter mVersionPresenter;private VersionModel mVersionModel;private VersionView mVersionView;private VersionPresenter(IView view){this.mVersionView = (VersionView) view;this.mVersionModel = new VersionModel();}public static VersionPresenter getInstance(VersionView view){if (mVersionPresenter == null){synchronized (VersionPresenter.class){if (mVersionPresenter == null){mVersionPresenter = new VersionPresenter(view);}}}return mVersionPresenter;}//获取版本信息public void getNewVersion(final Context context, String url){mVersionModel.getNewVersion(url, new VersionModel.VersionCallback() {@Overridepublic void onVersionCallback(final Version version) {((Activity)context).runOnUiThread(new Runnable() {@Overridepublic void run() {mVersionView.showVersionNameAndDesc(version);if (version.getHasNewVersion().equals("true")){mVersionView.showToast("App有新版本,请更新");}}});}});}}

用户通知presenter后,presenter就把view的需求通知model层,数据操作交给model层去做具体实现,可以见到在VersionPresenter的getNewVersion方法中只是把view传过来的参数给到model,具体的网络请求交给VersionModel去实现,下面是VersionModel的具体实现:

public class VersionModel implements IModel {public interface VersionCallback {void onVersionCallback(Version version);}private HttpURLConnection httpURLConnection = null;private InputStream inputStream = null;private BufferedReader bufferedReader = null;public void getNewVersion(final String url, final VersionCallback versionCallback) {new Thread(new Runnable() {@Overridepublic void run() {try {httpURLConnection = (HttpURLConnection) new URL(url).openConnection();httpURLConnection.connect();inputStream = httpURLConnection.getInputStream();bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));StringBuilder stringBuilder = new StringBuilder();String tempLine = null;while ((tempLine = bufferedReader.readLine()) != null) {stringBuilder.append(tempLine).append("\n");}String data = stringBuilder.toString();Log.e("data", data);JSONObject jsonObject;jsonObject = new JSONObject(data);Version version=new Version();version.setHasNewVersion("has_new_version");version.setVersionCode(jsonObject.optString("version_code"));version.setVersionName(jsonObject.optString("version_name"));versionCallback.onVersionCallback(version);} catch (Exception e) {e.printStackTrace();} finally {try {bufferedReader.close();inputStream.close();} catch (Exception e) {}}}}).start();}
}

VersionModel去执行网络请求,获取到VersonView需要的数据然后回调到VersionPresenter,再由VersionPresenter通知VersonView去做UI的变化或者其他一些操作。纵观整个过程可以发现,view层和model层没有一丝耦合,这就是mvp架构模式的初衷,做到了松耦合,view,model,presenter每一层负责自身的工作,绝不越界。

MVP架构模式简单示例相关推荐

  1. 来!喝杯可乐!让你秒懂 MVP 架构模式 | 原力计划

    作者 | 星河Dac 责编 | 胡巍巍 出品 | CSDN博客 在Android传统模式开发中,随着Activity的功能增多,其代码也在不断增加.那么我们很可能会发现,如果我们再要往Activity ...

  2. 什么是MVP架构模式(Model、View、Presenter)?(软件设计模式MVC、MVVW)

    View: 是显示数据(model)并且将用户指令(events)传送到presenter以便作用于那些数据的一个接口.View通常含有Presenter的引用.在Android开发中通常将Activ ...

  3. 【译】使用Kotlin和RxJava测试MVP架构的完整示例 - 第1部分

    原文链接:android.jlelse.eu/complete-ex- 最近我创建了一个playground项目来了解更多关于Kotlin和RxJava的信息. 这是一个非常简单的项目,但有一部分,我 ...

  4. Angularjs切换网站配色模式简单示例2(切换body元素的class)

    一个网站可以有多种配色方案,例如正常模式,夜间模式等. 简单示例一个通过点击toggle 按钮,切换body元素的class,达到切换配色模式的angularjs小app. 1. Live范例可以在以 ...

  5. Angularjs切换网站配色模式简单示例1(切换css文件)

    一个网站可以有多种配色方案,例如正常模式,夜间模式等. 简单示例一个通过点击按钮,更换css文件,达到切换配色模式的angularjs 小app. 主要文件有三个:index.html(主文件),wh ...

  6. Scrapy学习过程之二:架构及简单示例

    1.Scrapy架构 参考:https://docs.scrapy.org/en/latest/topics/architecture.html#data-flow 以下是架构图: 从上图可以看出,S ...

  7. Android MVP架构模式

    目录 概述 实例 Model View Presenter 后记 全部代码 Model View Presenter 概述 MVP模式是Android常见的的一种架构模式,全称是Model.View. ...

  8. Android —MVP架构—登录页面示例

    1.MVP的诞生 以下内容都是从安卓的角度分析: 首先要了解什么是MVC架构: 图片来源网络 View:对应XML文件及Activity或fragment,因为许多修改视图的操作在Activity中实 ...

  9. python设计模式名片_Python设计模式之门面模式简单示例

    本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...

  10. mvvm模式和mvc的区别_Android 开发中的架构模式 -- MVC / MVP / MVVM

    预备知识 了解 Android 基本开发 看完本文可以达到什么程度 了解如何分析一个架构模式 掌握 MVC,MVP,MVVM 架构定义和实现 更多面试内容,面试专题,flutter视频 全套,音视频从 ...

最新文章

  1. .NET 线程问题汇总
  2. COGS2355 【HZOI2015】 有标号的DAG计数 II
  3. 远程桌面,设置为支持2个人连接
  4. POJ 1806 Manhattan 2025
  5. 前台特效(9)无限极分类折叠菜单
  6. 重构-改善既有代码的设计 (该书写于1999)培训之一
  7. 质量故事(3)---袋鼠与笼子
  8. 光纤非线性效应对光OFDM信号的影响研究
  9. smobiler介绍(一)
  10. 计算机基础(01)基础知识
  11. 表格相对引用和绝对引用及相互切换(复制单元格函数公式保持不变)
  12. 无锁环形缓存器RingBuffer的原理
  13. 巨人就在你的身边——14期英语反馈表彰大会有感
  14. 永磁同步直线电机驱动控制原理与matlab建模仿真
  15. 大数据导出Excel导致内存溢出的解决方案
  16. Python编码、解码的理解(GBK,UTF-8,Unicode)
  17. 打开设备管理器出现MMC.EXE被阻止解决办法
  18. jdbc mysql 解密_数据库配置文件jdbc.properties 实现用户名密码加密
  19. 骁龙芯片性能排行2020_手机芯片性能排行榜
  20. 关于旁路由设置后,主路由WIFI无法上网的问题

热门文章

  1. php简易聊天室系统,php实现简易聊天室应用代码
  2. 关于ReWrite配置及iis重启命令
  3. 高斯函数及高斯滤波器
  4. 谈谈信息化、数字化、智能化和数智化的区别
  5. js自动生成html报表,JavaScript实现动态生成表格
  6. GB/T19001—2008质量管理体系要求、标准、贯标(贯彻标准)
  7. 【2022PMP最全总结-敏捷专题课】
  8. 阿里巴巴矢量图标使用
  9. BIOS开启了VT,但是CPU-V显示未开启
  10. HTML+CSS网页设计期末课程大作业:【中国传统文化——古诗词】学生网页设计作品 dreamweaver作业静态HTML网页设计