作者 | 星河Dac

责编 | 胡巍巍

出品 | CSDN博客

在Android传统模式开发中,随着Activity的功能增多,其代码也在不断增加。那么我们很可能会发现,如果我们再要往Activity里边加一个功能,而恰好这个功能又要读数据库又要请求Http,

加这么个功能要1000行代码(夸张),那么我们的Activity的代码就会变得十分臃肿,你没法快速地完成一个功能代码的修改。

因此,MVP架构模式正是解决这样一种情况的好方法

什么是MVP架构模式

在很多博客当中是这么解释MVP的。

M:Model,实体层,用于实现具体的复杂的逻辑。

V:View,视图层,用于展示数据、交互等。

P:Presenter,逻辑控制层,用于持有Model和View的实例。

然后就开始上一堆代码了,头疼......

因此我写下这篇文章打算用一种形象生动的方法,首先你需要接受这么一个设定。

View:你

Presenter:王大妈

Model:工具人

这么设定只是为了帮助理解,不要问为什么是王大妈而不是张大妈,这只是一个虚的东西。

正式开始

故事:你想要去买一瓶阔乐,以前的时候都是你自己一个人去买的,但是现在有一个王大妈出现了。

她说:“你把钱给我,可乐我帮你买,不多收费!”

你听了之后,这么划算的事情,那就这么定了。

于是你把钱给了王大妈,也把手机号码给了她。

但是我们都知道,天下没有免费的午餐,对于王大妈来说,这是个赚钱的机会。

王大妈知道一个低价买阔乐的渠道->工具人,她可以自己生产阔乐,因此价格便宜,她可以赚差价。

于是,王大妈找到了工具人,他们各自给了对方联系方式。

从此以后,你只要想喝阔乐,你就拨打王大妈的手机号跟她说。

而王大妈知道之后,她又打电话给工具人,向他要阔乐。

工具人听到之后,开始卖命地生产阔乐。

一段时间之后,阔乐搞出来了,工具人打电话通知王大妈,王大妈知道后又打电话通知你。

如此一来,阔乐就到手了。你也完全不知道阔乐是怎么来的,但确实到你手里了。

引入术语

这样以故事的形式来解释,我个人感觉会比较好理解。现在我们在故事的基础上将术语引入。

你:View

王大妈:Presenter

工具人:Model

从这种架构模式来看,View想要拿到数据显示,这个流程的逻辑将会变得十分清晰!

Presenter作为一个中间人,需要分两头联系View和Model。

而Model,只管把数据搞出来,再通知Presenter就好了,Presenter会做剩下的工作。

用代码举例

从上文可得知,王大妈和工具人都是十分具体的,但是如果另外一个张大爷也可以帮你完成代购,而且速度很快呢?

相信你一定也有了启发,这个时候 只要能代购到可乐,哪个中间人都行(只是效率问题)。

那有一天你不想喝阔乐了,想喝芬达了呢?

因此我们将这个Presenter(中间人)抽象,抽象成一个接口,只要能帮我们买到可乐,就能做这个中间人。

在中间人接口中,我们需要指定,这个中间人需要帮我们做些什么(代购些啥)。

同理,我们将Model(中间人)也抽象成一个接口,只要能干又苦又累的活都能做工具人。

在工具人接口中,我们需要指定,这个工具人要帮我们搞些什么东西。(生产些啥)

那你呢?你(View)也可以抽象成一个接口,我们需要指定,这个接口要些啥。(需要啥)

所以View需要啥→Presenter代购啥→Model生产啥。随后,Model生产完成→Presenter代购完成→View心愿完成。

这个流程都是十分清晰的,接下来直接上代码了。

上代码,新建3个接口

新建3个包,分别为Model,Presenter和View,在Presenter包中,添加MiddlePeople接口(中间人接口)。

package cn.daccc.mvpdemo.presenter;/*** 中间人接口,只要能帮我们买到可乐,能通知我们就行*/
public interface MiddlePeople{//买可乐void buyCola();//购买成功后调用该方法void buySucceed();
}

在Model包中,添加ToolPeople接口(工具人接口)。

package cn.daccc.mvpdemo.model;/*** 工具人接口,只要能生产可乐就行*/
public interface ToolPeople{//生产可乐void produceCola();}

在View包中,添加Me这个接口,实现喝可乐的心愿(中间人买回来之后我们就可以喝了)。

package cn.daccc.mvpdemo.view;/*** 实际上不一定是你想喝,你同学也想喝呢?就假装他也是“你”*/
public interface Me {//喝可乐void drinkCola();
}

我们添加了上面的3个接口,都是没有具体的实现的,也就是说,也就嘴上说说而已,没有实际行动。

因此我们来建立真真实实的类,去完成上述行为。

上代码,新建2个类

我们指定HanHan(憨憨)作为工具人,让他去帮我们生产可乐。

在Model包中新建一个HanHan类。这里注意了,这个憨憨要符合工具人的特性,因此他要实现ToolPeople接口的所有方法,做工具人做的事。

因此,他要实现接口中的produceCola()方法。

package cn.daccc.mvpdemo.model;
import android.util.Log;
/*** 工具人憨憨,他要符合工具人的特性才能帮我们做事,因此要实现Tool接口*/
public class HanHan implements ToolPeople {@Overridepublic void produceCola() {Log.d("ToolPeople","生产可乐好累啊!");}
}

你会发现,HanHan生产完了,怎么通知呢?

所以,HanHan要知道中间人的联系方式,因此HanHan要在中间人联系他的时候保存好中间人的联系方式,然鹅HanHan并不知道中间人具体是谁,所以要用接口类型来保存中间人。

package cn.daccc.mvpdemo.model;
import android.util.Log;
import cn.daccc.mvpdemo.presenter.MiddlePeople;
/*** 工具人憨憨,他要符合工具人的特性才能帮我们做事,因此要实现Tool接口*/
public class HanHan implements ToolPeople {//保存中间人的联系方式private MiddlePeople middlePeople;public HanHan(MiddlePeople middlePeople){this.middlePeople = middlePeople;}@Overridepublic void produceCola() {Log.d("ToolPeople","生产可乐好累啊!");//HanHan生产好了,告诉中间人TA购买成功了middlePeople.buySucceed();}
}

在Presenter包中新建WangDaMa类。

现在已经有了一个具体的工具人了,但是我们还差个具体的中间人。

因此我们指定WangDaMa(王大妈)为中间人,这王大妈既要有“我”的联系方式,也要找到一个符合要求的工具人并且保存工具人的联系方式,因此她找到了HanHan。

package cn.daccc.mvpdemo.presenter;import android.util.Log;import cn.daccc.mvpdemo.model.ToolPeople;
import cn.daccc.mvpdemo.view.Me;/*** 中间人,指定王大妈是中间人,因此她要做所有中间人该做的事情*/
public class WangDaMa implements MiddlePeople {private Me me;private ToolPeople toolPeople;//保存“我”的联系方式,并指派HanHan为工具人,保存他的联系方式public WangDaMa(Me me,ToolPeople toolPeople){this.me=me;toolPeople = new HanHan(this);}@Overridepublic void buyCola() {Log.d("MiddlePeople","我来帮你买可乐");//让工具人去生产可乐toolPeople.produceCola();}@Overridepublic void buySucceed() {//买成了,通知“我”可以开始嚯阔乐啦me.drinkCola();}
}

在MainActivity中实现Me这个接口,我们找一个中间人做代购,因此我找到了王大妈。

我只要想喝可乐只需要点击一下按钮,就让中间人帮我买可乐,买完之后再告诉我就可以了。

public class MainActivity extends AppCompatActivity implements Me{private MiddlePeople middlePeople = new WangDaMa(this);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_drink = findViewById(R.id.btn_drink);btn_drink.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击按钮,就让中间人帮我们买可乐middlePeople.buyCola();}});}/*** 实现Me接口中的drinkCola方法,让喝可乐这件事情有一个更加具体的描述*/@Overridepublic void drinkCola() {Toast.makeText(this, "这阔乐真他*的好嚯!", Toast.LENGTH_SHORT).show();}
}

结果展示

诶,就很舒服。

弊端

打住,舒服是暂时的,到底有没有必要为了喝个可乐去搞那么多乱七八糟的什么中间人工具人呢?

答案就是:请使用长远的眼光,来决定在具体Android开发项目中到底需不需要使用MVP架构模式。

文章中这样的设计模式会增加很多的类的接口,这是一个弊端,当然可以优化!

总结

从上边的故事和例子来看,是不是都理解了呢?如果还不理解,你来砍我(顺着网线来)。

哈哈,开个玩笑,我们来总结一下。

ToolPeople:实际上是Model,它做很多又苦又累的工作,因此把业务代码放在这里

MiddlePeopl:实际上是Presenter,它做一个中间人的角色,可以执行少量的业务代码,比如简单判断这件事情能不能干的成

Me:实际上是View,喝可乐这件事情最终体现在View中,但是它无需知道可乐是怎么来的,它只需要委派中间人去实现就可以了

这里的什么憨憨,王大妈,“我”。都是为了帮助理解而已,相信认真看完文章的人,应该都理解了,因此这些类的名称,这些接口的名称,都应该按照规范来命名

编程很少是一个人的工作,所以学习如何架构代码是进阶的必经之路。本文分享了我对MVP架构的一些浅见,希望能够帮助大家理解。

如果文章有误,恳请指出,十分感谢!机会,总是留给有准备的人。共勉。

原文链接:

https://blog.csdn.net/c529283955/article/details/104501002

声明:本文系CSDN博主原创文章,版权归作者所有。

《原力计划【第二季】- 学习力挑战》

正式开始

即日起至 3月21日

千万流量支持原创作者

更有专属【勋章】等你来挑战

推荐阅读 

☞又一 5G+AIoT 的强强联手!

近一半程序员单身、年薪低于 15 万,程序员扎心现状大调查!

☞大脑芯片公司Neuralink计划在人脑内植入芯片,他们到底想干什么?

☞做开发依然很穷?试试做好这 7 件事!

☞深耕技术,与实践赛跑:一文告诉你如何稳妥快速完善区块链技术并有序推动商用?

☞Spark大数据分布式机器学习处理实战 | 博文精选

你点的每一个在看,我认真当成了喜欢

来!喝杯可乐!让你秒懂 MVP 架构模式 | 原力计划相关推荐

  1. 找不到libmmd.dll无法继续执行代码_300 行代码带你秒懂 Java 多线程!| 原力计划...

    作者 | 永远在路上[] 责编 | 胡巍巍 出品 | CSDN博客 线程线程的概念,百度是这样解释的:线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际 ...

  2. 300 行代码带你秒懂 Java 多线程!| 原力计划

    作者 | 永远在路上[] 责编 | 胡巍巍 出品 | CSDN博客 线程 线程的概念,百度是这样解释的: 线程(英语:Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的 ...

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

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

  4. Android MVP架构模式

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

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

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

  6. mvp架构 java_GitHub - AnthonyCoder/MvpForJava: 一个可直接快速引入的 Java 版本的模块化 MVP 框架...

    使用Java构建的一个模块化的MVP的项目 个人项目仅供学习使用,感谢以下开放Api: Demo简介 该 Demo 更加详细的封装思路,请点击文章如何既装逼又优雅的设计一个模块化的MVP架构 提供给初 ...

  7. Android MVP开发模式及Retrofit + RxJava封装

    代码已上传到Github,因为接口都是模拟无法进行测试,明白大概的逻辑就行了! 欢迎浏览我的博客--https://pushy.site 1. MVP模式 1.1 介绍 如果熟悉MVP模式架构的话,对 ...

  8. 浅谈 MVC、MVP 和 MVVM 架构模式

    2019独角兽企业重金招聘Python工程师标准>>> 谈谈 MVX 中的 Model 谈谈 MVX 中的 View 谈谈 MVX 中的 Controller 浅谈 MVC.MVP ...

  9. 如何使用MVP架构Android应用项目

    目录 MVP简介 MVP结构 MVP与MVC区别 实战演习 正文 1.MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为 ...

最新文章

  1. h.265编码库x265实例
  2. java 方法中定义类_在Java方法中使用类定义
  3. ByteBuffer常用方法详解
  4. 记录kylin成功启动,访问页面404问题
  5. NYOJ--289--苹果
  6. visual studio编Java,如何用Visual Studio编译Java源代码
  7. PPT中插入Flash
  8. Python3: chardet 检测 bytes 的原字符串编码格式
  9. asp.net pdf如何转换成tif_PDF如何转换成PPT格式?PDF转PPT软件使用方法分享
  10. 程序员月薪25000,很可能会掉进这个陷进了!
  11. python输入一个浮点数、输出其整数部分和小数部分_输入一个浮点数,并输出该数的整数部分和小数部分...
  12. 常用的18大学术搜索引擎
  13. 天翼4gdongle linux,SIM7600X 4G DONGLE用户手册 (重定向自SIM7600CE-CNSE 4G DONGLE)
  14. 用 turtle 绘制圆形
  15. 方维分享怎样修改数据库配置
  16. FFmpeg支持的音频和视频编解码格式
  17. 厂部和车间的区别_什么是车间?为什么叫车间?
  18. 清华团队通过监督贝叶斯嵌入,对单细胞染色质可及性数据进行细胞类型注释...
  19. div在屏幕中如何实现居中效果
  20. HDU 4997 Biconnected (状态压缩DP)

热门文章

  1. 使用Mysql 5.5数据库Hibernate自动建表创建表出错table doesn't exist
  2. dp(0,1背包)-----高数Umaru系列(9)——哈士奇
  3. 动态规划学习(35分钟视频课)
  4. java面试题常见的坑_java那些年踩过面试题的坑,你是否依旧记忆犹新!
  5. rust笔记3 referenceborrow
  6. Boost.Asio的网络编程
  7. Python实现A*算法解决N数码问题
  8. flask(五) cookie 和session
  9. 2021-2025年中国氮化碳行业市场供需与战略研究报告
  10. 如何实现二级菜单 html,javascript,html5_如何用vue实现二级菜单栏,javascript,html5,html,vue.js - phpStudy...