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

说起MVP设计模式,做开发的可能都不会陌生,多少都会有点自己对它的理解。那么本篇博客就记录一下我对它的理解。

其实,从一开始我有点不理解为什么要有设计模式这种东西和为什么要去用它。如果说为什么要有设计模式,这个很好解决,设计模式可以让我们的软件更容易维护扩展,使代码之间的关系变得更加清晰。那么为什么要用它呢?本来一个Activity就可以解决的问题,竟然要额外写那么多接口和类,MVP三者之间这个持有那个,那个调用这个,天哪,怎么感觉比原来麻烦多了呢。我相信大部分初次接触MVP的人都有过这种想法。本次,我就详细说说MVP到底是啥,怎么理解它,用它能为我们的项目带来怎样的实际好处。

MVP是啥?
M—>Model,Model代表模型,可以存储、请求、操作数据。
V—>View,VIew代表视图,负责界面,用于展示数据、绘制UI元素、与用户进行交互,简单理解就是Activity、Fragment。

P—>Presenter,Presenter翻译过来是主持人、中间人的意思。不同于MVC设计模式,Model和View之间通过Presenter进行联系沟通。

先放一张MVP三者之间的关系图:

对MVP有了一个初步的了解后,可以进一步的去理解它了,设计模式的初衷就是为了降低代码的耦合,划分职责,使得业务和逻辑区分开来,隐藏多余数据,增强代码的灵活性。举个例子:
把Activity看做是一家餐厅,按照普通的开发方式来看,这家餐厅只有一个人在维持,自己点菜,自己响应自己的点菜需求(数据处理),自己做菜再自己在端给自己(UI展示),要是真有这种餐厅,估计这个人也是个神经病,自己把本属于不同角色的事都干了。不过幸好有MVP设计模式,可以让他做个正常人。

还是把Activity看做为一家餐厅,不过这次不再是一个人了,而是有三个人,他们职责分工很明确,其中有个顾客叫View,有个服务员叫Presenter,有个厨师叫Model。可以想到,顾客(View)来点菜,告诉服务员(Presenter)要哪些菜,点完菜后服务员(Presenter)通知大厨(Model)来单了快去做菜,等大厨(Model)做好菜了,又通知服务员(Presenter)说菜做好了,于是服务员赶紧把大厨做好的菜端给顾客(View)。这就是一个典型的MVP模式流程,也更接近现实生活中的场景。这样能理解MVP模式是怎么回事了吧,它让餐厅的运营正常了起来,餐厅里的人各司其职,井然有序,放在代码里也是一样。

使用了MVP模式的逻辑是这样的

最后使用MVP模式可以为项目带来什么样的实际好处呢。先说说缺点吧,接口和类数量的暴涨是一个,理解成本是一个,比较费时间是一个。优点呢,用比较官方的话来说一是软件架构上具有明确的分工,各个模块的职责功能平衡分配,并且清晰明确。二是软件的可测试性提高,一般良好的软件架构都具备良好的可测试性。三是良好的易用性,维护成本低。不过确切的好处还是自己使用过后才明白,小项目就不推荐使用了,如果你想拿小项目练练手也是无可厚非的。
已上就是我对MVP模式的理解了,如果有什么不同的意见,希望大家可以在下面多多评论留言。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本功能 2016/10/31 添加抽奖功能,修复已知Bug(点击删除购物,出现闪退bug) 2016/10/28 添加微信分享功能 2016/10/28 添加忘记密码功能、完善用户评价系统、以及完善订单页面按钮功能及显示 2016/10/27 添加自动更新功能,修复已知的登陆闪退Bug 2016/10/26 添加订单查询(全部订单、待付款、待发货、待收货、待评价、退款和售后等查询)以及显示功能,收藏宝贝查询、及显示功能 2016/10/25 添加加入购物车功能、移除购物车的商品和下单之后更新购物车等功能 2016/10/24 添加评论功能的显示、登陆用户的收藏和取消收藏功能、下单页面的显示、以及下单功能的实现 2016/10/23 添加商品的类别显示、分类查询展示、固定数据的搜索(暂时数据固定) 2016/10/22 添加用户注销功能、头像的上传以及更新用户个人资料功能 2016/10/20 添加注册、登陆、加载默认头像等功能、解决ViewPager Fragment Fragment被预加载问 2016/10/19 进行主页、微淘、问大家、购物车、我的淘宝等页面的设计、添加轮播图、资讯滚动条功能 2016/10/18 构建基本MVP框架 开发过程遇到的问题(可能导致程序无法运行的bug)及解决方案 当用户未登录时,点击购物车,登陆之后,程序闪退 出现问题 :NullPointerException 解决方案: 使用Fragment的延时加载(懒加载)实现对数据的加载 拍照时无法进行图片的裁剪(不断加载) 解决步骤如下: Activity跳转时图库时的Intent如下 Intent takePhotoIntent = new Intent( “android.media.action.IMAGE_CAPTURE”); takePhotoIntent.putExtra( MediaStore.EXTRA_OUTPUT, imageUri); 在onActivityResult()方法调用P层进行处理,相关代码如下 String uri = Environment.getExternalStorageDirectory() “/icoImage.jpg”; if(!allSelectedPicture.contains(uri)){ allSelectedPicture.add(uri); } ViewPager和Fragment结合使用,Fragment出现被预计载的情况 解决方案 项目使用的主要技术及框架 框架 ButterKnife 注解绑定获取控件功能 Picasso 网络和本地图片的加载功能 okhttp 网络连接功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值