记得第一次接触MVP开发是上大学的时候,当时看了数十篇关于MVP的文章,这里不得不吐槽一下国内技术帖子的质量真是参次不齐啊。看完以后一直懵懵懂懂的,总觉有几处关键的地方没搞清可是文章中却一带而过了,好比:html
抱着这些问题,我本身摸索着构建出了一套个性化风格MVP架构,使用过程当中也优化了几回,现在一年多过去了再看这套架构也就算是个能用吧,因此决定新的架构优化。小程序
本文讲述了MVP的核心概念和如何从最初的乞丐版MVP架构一步步升级到平民版MVP架构,时尚版MVP架构,以及即将开始更新的旗舰版MVP架构,为了保证思路清晰,文中包含大量代码与文字,跟着文中的例子即可写出一个完整的MVP架构。安全
其实咱们平常开发中的Activity,Fragment和XML界面就至关因而一个 MVC 的架构模式,Activity中不只要处理各类 UI 操做还要请求数据以及解析。网络
这种开发方式的缺点就是业务量大的时候一个Activity 文件分分钟飙到上千行代码,想要改一处业务逻辑光是去找就要费半天劲,并且有点地方逻辑处理是同样的无奈是不一样的 Activity 就没办法很好的写成通用方法。架构
那 MVP 为啥好用呢?app
MVP 模式将Activity 中的业务逻辑所有分离出来,让Activity 只作 UI 逻辑的处理,全部跟Android API无关的业务逻辑由 Presenter 层来完成。异步
将业务处理分离出来后最明显的好处就是管理方便,可是缺点就是增长了代码量。ide
在MVP 架构中跟MVC相似的是一样也分为三层。post
Activity 和Fragment 视为View层,负责处理 UI。优化
Presenter 为业务处理层,既能调用UI逻辑,又能请求数据,该层为纯Java类,不涉及任何Android API。
Model 层中包含着具体的数据请求,数据源。
三层之间调用顺序为view->presenter->model,为了调用安全着想不可反向调用!不可跨级调用!
那Model 层如何反馈给Presenter 层的呢?Presenter 又是如何操控View 层呢?看图!
上图中说明了低层的不会直接给上一层作反馈,而是经过 View 、 Callback 为上级作出了反馈,这样就解决了请求数据与更新界面的异步操做。上图中 View 和 Callback 都是以接口的形式存在的,其中 View 是经典 MVP 架构中定义的,Callback 是我本身加的。
View 中定义了 Activity 的具体操做,主要是些将请求到的数据在界面中更新之类的。
Callback 中定义了请求数据时反馈的各类状态:成功、失败、异常等。
下面咱们用 MVP 模式构造一个简易模拟请求网络的小程序。效果图以下:
下面是Demo中的Java文件目录:
Callback 接口是Model层给Presenter层反馈请求信息的传递载体,因此须要在Callback中定义数据请求的各类反馈状态:
Model 类中定了具体的网络请求操做。为模拟真实的网络请求,利用postDelayed
方法模拟耗时操做,经过判断请求参数反馈不一样的请求状态:
View接口是Activity与Presenter层的中间层,它的做用是根据具体业务的须要,为Presenter提供调用Activity中具体UI逻辑操做的方法。
Presenter类是具体的逻辑业务处理类,该类为纯Java类,不包含任何Android API,负责请求数据,并对数据请求的反馈进行处理。
Presenter类的构造方法中有一个View接口的参数,是为了可以经过View接口通知Activity进行更新界面等操做。
在Activity代码中须要强调的是若是想要调用Presenter就要先实现Presenter须要的对应的View接口。
至此,已经完整的实现了一个简易的MVP架构。
注意!以上代码中还存在很大的问题,不能用到实际开发中,下面会讨论目前存在的问题以及如何优化。
由于上节中乞丐版MVP Demo的代码只实现了一个Activity的请求操做,容易出现一个概念的混淆:
每一个Activity都须要有与它对应的一套MVP(Model,View,Presenter)吗?
答案确定是否认的!
首先不须要数据请求的Activity固然就一样不须要MVP辅助。与其余Activity中存在相同逻辑的Activity,就不须要重复生成对应的MVP。可是这个存在相同逻辑的定义,不一样的场景有不一样的说法:
场景1中Activity A和Activity C都只有一个“买东西”的逻辑,属于典型的逻辑相同,因此Activity C就能够直接用Activity A写好的MVP无需再作任何处理。
场景2和场景3的逻辑相似,都属于一个业务逻辑中包含另一个能够单独存在的业务逻辑,这种状况采用继承的方法便可
场景4中Activity C想要同时调用独立服务于Activity A 和 Activity B的业务逻辑,只须要将两个业务逻辑对应的Presenter分别实例化并调用业务方法便可:
经过上面一揽子场景的分析,得出的第一个结论就是MVP的结构太过于繁重,因此为了不多写重复代码和往后须要进行无心义的修改,在开发前必定要设计好逻辑调用图,这样才能事半功倍。
对于上面经典的经过业务逻辑继承实现包含重复逻辑的方法,其实也能够在一个Presenter中写好完整的逻辑方法,对于不一样的Activity须要哪一个业务逻辑方法就调用哪一个,这样岂不就简单多了。可是从架构设计角度看这种作法是不严谨的,可能存在漏洞,因此为保持软件架构的健壮仍是不要偷懒的好。
以前说过乞丐版MVP架构模式中还存在不少问题不能应用到实际的开发中,大概存在的问题有:
针对这些问题咱们须要进一步优化,单车变摩托,升级为能够在实际开发中使用的平民版MVP架构。
平民版MVP架构 优化代码可参考 ————>>>>
博文出处:http://www.jcodecraeer.com/a/anzhuokaifa/2017/1020/8625.html?1508484926