谈谈Android中的MVP

模式

谈MVP之前我们先来聊一聊软件开发中的模式,在软件开发中由于需求的不断变更,产品的不断迭代,程序员们为了应付产品经理不断变化的需求,提出了一系列的定式。定式一词最早应该是来源于围棋中的术语,围棋的定式本质上也就是通过一定开局方式来提高围棋的胜率,软件开发中也是一样的,通过精心设计的一系列定式,来解决软件开发中反复遇到的一些问题,来快速响应产品需求。

关于“模式”在开发中会会提及两个词,设计模式和架构模式,两者是有区别的,我的理解是:设计模式更加关注于微观,架构模式更加关注于宏观设计。往往都是架构模式针对的是整个产品层面的设计,设计模式针对的是产品中的某一个功能点的设计,比较常见的MVC和MVP就属于宏观架构模式,观察者和模板模式就属于微观设计模式。当然也不是绝对的,设计模式中也可能具有宏观架构,架构模式中也可能有微观架构,不过从并集结构来看,大体如此。

架构模式的设计更加注重于产品业务层面的考虑,常见的框架模式有如下几种:

  • 分层模式
  • 微模式
  • 事件驱动
  • 基于空间架构

当然,在实际设计中可能会有多种框架设计方式结合一起。关于设计模式和架构模式,推荐两本书,GOF的《设计模式》和Frank Buschmann的《面向模式的软件设计》。

分层思维和MVC模式

MVC模式本质上就是属于框架模式中的分层架构,分层架构其实就是模仿自然界各司其职的思维方式,这种思维在互联网公司的组织架构中尤其明显,产品经理负责功能规划,软件开发工程师负责开发出对应功能,测试人员保证软件质量。网络协议也是一个著名的分层思想 :

Java EE是一个天然的MVC分层架构

  • 视图View: JSP文件负责显示,直接和用户打交道
  • 控制器Controller:一般是一个servlet,完成业务逻辑处理,并伴随着请求Model层数据
  • 模型层Model:表现在Java EE中就是一些bean以及持久化数据逻辑。Model层可以直接将数据发送给View,通知View重新渲染数据

MVC优缺点网上有很多人谈,比如MVC具有低耦合性,高内聚性、可维护性强等等,缺点是需要新建的类非常多,C层快速膨胀等等。但是这些都不是致命的缺点,真正致命的缺点后面再谈。

为什么是MVP而不是MVC?

下图直观的显示了MVP和MVC的区别:

几句话来区分一下MVP和MVC:

  • 用P层替代了C层
  • P层和V层之间通过一层接口来进行解耦
  • V层和M层不会直接通信,通信仅仅局限于V和P之间

MVP和MVC比有什么好处?一句话来说:

增加了中心节点,减少了数据流向的混乱

明显,P层就是MVP种的中心节点,中心节点有什么好处?

令行禁止,说一不二

所有的数据都从P层流入,流出,数据流向透明、可控,MVC具有的一优点MVP都有,而MVC由于缺少中心化的数据控制层,所以V层可以直接和M层通信,导致数据的流入和流出一团糟,这个就是MVC的致命缺点之一,它本身违背了分层思想中的分层隔离的思想。

Android开发中为什么MVC不好使,一个原因是Android本身就不是一个天然的MVC架构,它只是一个类MVC架构,M层是数据层,C层是Activity/fragment,V是XML文件,XML的生命周期又需要依赖于Activity/fragment,所以在Activity/fragment中会有对View的操作。 另外一个原因是MVC在Android开发中的局限,V层会经常对M层做通信,比如V层中接收M层数据的变化,刷新页面,这种直接M直接作用于V;有时候可能C层也会直接通知V层来响应数据的变化,如果出现BUG,你很难找到是哪一个部分导致的.而MVP模式通过把逻辑缩到P层,通过在View和presenter之间增加一层接口,而减少model和view层的交互,从而把部分逻辑完全转接给presenter层,进一步减少了View层的逻辑,这样依赖View能够真正的做到完全处理UI方面的工作.

  • 降低耦合度:MVP减少了MVC模式下V和C的直接交互,进一步减少了V层的逻辑处理.让V层变的非常薄,P层变的很厚.
  • 增加V层和P层直接之间的接口,让P层可以直接操作V层UI,把逻辑完全转嫁给P层处理
  • Activity 只处理生命周期的任务和View层的逻辑
  • Presenter层被抽象称接口,便于进行单元测试
  • 减少内存泄漏的风险,因为异步任务完全抽象称了接口,减少了相互之间的引用

优点说完了,缺点也同样明显。MVP的中中心化的问题在于中心节点承载过多的逻辑,导致P层不断臃肿,特别是在Android开发中,网络请求、数据库操作、控制逻辑等等,P层逻辑不断增加,最后出现了一个巨型的上帝类。

这个时候你需要一个工具,去简化P层代码。

RxJava

RxJava正是这个工具。RxJava是什么,简单来说:

RxJava让你通过事件流的方式来对数据进行操作,这种操作包括数据的组合、包装、监听,并且让你在同步和异步线程中自如切换。

关于RxJava更多介绍,点击这里

RxJava在MVP中起到的作用:

通过对事件流的操作,减化P层的逻辑,减少代码的耦合

怎么减少?

  • 异步操作的简便性,彻底抛弃各种地狱回调
  • 彻底诀别坑爹的AnsyTask

一句话来说:

越是复杂的逻辑,越能体现RxJava的优越性

更多关于RxJava的学习参考其它教程。

MVP的工程实践

MVP的实践基本是基于谷歌官方的架构

具体工程实践下一篇在讲。

总结

软件架构永远是服务于业务的,业务的复杂度决定了架构的简洁性,在很多时候,架构不是万能的,在无法用架构解决情况下,考虑对业务做精简和分层能够达到很好的效果。MVC架构在分层架构中是占有非常重要的地位,不过由于MVC本身的缺点和Android自身架构的局限性,原生的MVC在Android应用会有非常多的问题,而MVP架构的分层+中心化的架构模式能够在Android的项目中取得良好的效果。

参考文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值