MVP架构模式简单示例
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架构模式简单示例相关推荐
- 来!喝杯可乐!让你秒懂 MVP 架构模式 | 原力计划
作者 | 星河Dac 责编 | 胡巍巍 出品 | CSDN博客 在Android传统模式开发中,随着Activity的功能增多,其代码也在不断增加.那么我们很可能会发现,如果我们再要往Activity ...
- 什么是MVP架构模式(Model、View、Presenter)?(软件设计模式MVC、MVVW)
View: 是显示数据(model)并且将用户指令(events)传送到presenter以便作用于那些数据的一个接口.View通常含有Presenter的引用.在Android开发中通常将Activ ...
- 【译】使用Kotlin和RxJava测试MVP架构的完整示例 - 第1部分
原文链接:android.jlelse.eu/complete-ex- 最近我创建了一个playground项目来了解更多关于Kotlin和RxJava的信息. 这是一个非常简单的项目,但有一部分,我 ...
- Angularjs切换网站配色模式简单示例2(切换body元素的class)
一个网站可以有多种配色方案,例如正常模式,夜间模式等. 简单示例一个通过点击toggle 按钮,切换body元素的class,达到切换配色模式的angularjs小app. 1. Live范例可以在以 ...
- Angularjs切换网站配色模式简单示例1(切换css文件)
一个网站可以有多种配色方案,例如正常模式,夜间模式等. 简单示例一个通过点击按钮,更换css文件,达到切换配色模式的angularjs 小app. 主要文件有三个:index.html(主文件),wh ...
- Scrapy学习过程之二:架构及简单示例
1.Scrapy架构 参考:https://docs.scrapy.org/en/latest/topics/architecture.html#data-flow 以下是架构图: 从上图可以看出,S ...
- Android MVP架构模式
目录 概述 实例 Model View Presenter 后记 全部代码 Model View Presenter 概述 MVP模式是Android常见的的一种架构模式,全称是Model.View. ...
- Android —MVP架构—登录页面示例
1.MVP的诞生 以下内容都是从安卓的角度分析: 首先要了解什么是MVC架构: 图片来源网络 View:对应XML文件及Activity或fragment,因为许多修改视图的操作在Activity中实 ...
- python设计模式名片_Python设计模式之门面模式简单示例
本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...
- mvvm模式和mvc的区别_Android 开发中的架构模式 -- MVC / MVP / MVVM
预备知识 了解 Android 基本开发 看完本文可以达到什么程度 了解如何分析一个架构模式 掌握 MVC,MVP,MVVM 架构定义和实现 更多面试内容,面试专题,flutter视频 全套,音视频从 ...
最新文章
- .NET 线程问题汇总
- COGS2355 【HZOI2015】 有标号的DAG计数 II
- 远程桌面,设置为支持2个人连接
- POJ 1806 Manhattan 2025
- 前台特效(9)无限极分类折叠菜单
- 重构-改善既有代码的设计 (该书写于1999)培训之一
- 质量故事(3)---袋鼠与笼子
- 光纤非线性效应对光OFDM信号的影响研究
- smobiler介绍(一)
- 计算机基础(01)基础知识
- 表格相对引用和绝对引用及相互切换(复制单元格函数公式保持不变)
- 无锁环形缓存器RingBuffer的原理
- 巨人就在你的身边——14期英语反馈表彰大会有感
- 永磁同步直线电机驱动控制原理与matlab建模仿真
- 大数据导出Excel导致内存溢出的解决方案
- Python编码、解码的理解(GBK,UTF-8,Unicode)
- 打开设备管理器出现MMC.EXE被阻止解决办法
- jdbc mysql 解密_数据库配置文件jdbc.properties 实现用户名密码加密
- 骁龙芯片性能排行2020_手机芯片性能排行榜
- 关于旁路由设置后,主路由WIFI无法上网的问题
热门文章
- php简易聊天室系统,php实现简易聊天室应用代码
- 关于ReWrite配置及iis重启命令
- 高斯函数及高斯滤波器
- 谈谈信息化、数字化、智能化和数智化的区别
- js自动生成html报表,JavaScript实现动态生成表格
- GB/T19001—2008质量管理体系要求、标准、贯标(贯彻标准)
- 【2022PMP最全总结-敏捷专题课】
- 阿里巴巴矢量图标使用
- BIOS开启了VT,但是CPU-V显示未开启
- HTML+CSS网页设计期末课程大作业:【中国传统文化——古诗词】学生网页设计作品 dreamweaver作业静态HTML网页设计