实现Android主流网络框架封装,可无缝侵入切换框架
一、什么是“有多种可替代解决方案的业务逻辑”?
举几个例子说明:
客户端的http请求操作,可以实现的方案有Retrofix、OkHttp、Volley等;
客户端的数据库存储方案可以为Realm、greenDao、OrmLite等;
图片加载的方案可以是Fresco、Glide、Picasso、UIL等。
二、如何快速替换?
先来描述一下需求,比如说,目前正在用的http请求是Volley,现在发现使用OkHttp来封装一套会更好。又比方说,目前正在用的数据存储方案是OrmLite,现在使用greenDao或者Realm会更好,在类似这些情况下,如何做到不修改Activity/Fragment/Presenter代码的情况下,把Volley的http请求实现更换成Okhttp的实现,把OrmLite更换成greenDao或者Realm?
解决问题的关键词:设计模式中的——工厂方法模式。
本质:利用接口进行解耦。
说到这里,可能很多有经验的朋友已经会心一笑,是的,老实说这篇文章可能对老司机没有太大的意义,但是如果看到这里还是心存疑问,或者你不知道什么是工厂方法模式,也不知道如何使用接口解耦什么的,没关系,请继续往下看。
三、Talk is cheap, show me the code.
下面,我们就用Volley更换到OkHttp这个例子来说明一下如何做到不修改Activity/Fragment/Presenter的代码情况下,更快地更换业务逻辑实现的代码。
在开始之前先来思考一下上述所说“可替代解决方案”的含义,为何这些方案是可替代的?是因为它们具有相同的共性,它们所要解决的问题是相同的,比如说http请求框架,无论是Volley/OkHttp/Retrofix,它们所要实现的都是http请求中的get/post/put/delete这些方法,数据库存储框架中无论是Realm/greenDao/OrmLite,它们要实现的都是增删改查这些方法。
“博主你别再瞎逼逼,赶紧说重点…”
我:dalao我错了,下面说重点…
先来概括一下我们的实现思路:
把http请求框架的共性方法抽取到接口中,我们把这个接口称为“请求接口”;
创建一个用于返回请求结果的接口,我们把这个接口称为“回调接口”;
分别用Volley和OkHttp实现“请求接口”;
创建一个类来返回上述接口的对象,我们把这个类叫做“工厂”类;
在Activity/Fragment/Presenter中,使用“工厂”返回的这个接口对象调用get/post/put/delete方法,并在“回调接口”中得到请求结果。
本文完整代码 https://github.com/AweiLoveAndroid/HttpRequestProcessor ,可以先clone到本地再看文章,为了方便阅读,下文中的代码将省略非重点部分。
四、具体步骤:
Step1:把http请求框架的共性方法抽取到接口中(也就是上述说的get/post/put/delete这些方法)
上面的IRequestManager接口中用到的请求结果回调接口——IRequestCallback
至此,我们已经把数据请求的接口,以及数据返回的接口都定义好了,整理一下思绪
● 1.首先我们搞清楚http请求,有哪些方法,需要有哪些参数——IRequestManager;
● 2.数据返回会有什么情况?——IRequestCallback;
Step2:用Volley来实现IRequestManager这个接口
VolleyRequestManager实现了IRequestManager接口,到这里我想你也看出来可以使用VolleyRequestManager来进行get/post/put/delete操作了,是的,已经可以用于请求操作,但是我们先不这样做,原因请继续往下看Step3。
Step3:创建一个类来返回IRequestManager请求接口的对象
到这里,请容许我再逼逼一下,为什么要用这种方法来返回对象,而不直接在Activity/Fragment/Presenter中创建VolleyRequestManager对象来进行操作?如果直接在Activity/Fragment/Presenter中使用VolleyRequestManager来创建对象,你的代码就依赖了VolleyRequestManager,这种情况下,如果要更换成OkHttp,岂不是要把代码中所有的VolleyRequestManager对象也更换成OkHttp的请求对象?再试想一下,如果你有很多个Activity/Fragment/Presenter使用了VolleyRequestManager对象,你是不是要每个地方都更换一遍?
使用RequestFactory的方式在Activity/Fragment/Presenter中创建对象,代码只依赖了IRequestManager这个接口,这就是使用接口进行解耦的关键点,无论在什么地方使用了这个接口,当要更换实现的时候,只需要修改RequestFactory中return的实现类就可以了。
Step4:调用上述方法进行测试
注意我们创建请求对象的代码,这里没有出现具体的实现类:
IRequestManager requestManager = RequestFactory.getRequestManager();
Step5:不更改MainActivity中任何代码,把Http请求的逻辑替换成OkHttp来实现
1)先用OkHttp来实现IRequestManager这个接口.
2) 使用OkHttp更换Volley
现在我们用OkHttp的请求方式也实现了一套get/post/put/delete的请求方法,此时只要修改Step3中,返回的对象为OkHttpRequestManager对象,就已经完成了我们整个http请求框架的更换,此时,你可以完全移除Volley的引用以及代码,而不会对程序有任何影响。
总结:
对于有多种可替代解决方案的业务逻辑,我的解耦思路是这样的:
1. 抽取它们的共性方法到接口中;
2. 使用自己选择的实现方案去实现;
3. 使用“工厂”类把具体实现转换成抽象接口,并返回抽象接口对象;
4. Activity/Fragment/Presenter中,使用“工厂”中返回的接口进行操作,而不要依赖于其实现类。
5. 要更换方案的时候,只需要修改“工厂”中返回的实现类。
后记:
这篇文章只是提供一种解耦思想,而不是“如何封装http请求框架”的教程,也不是讨论“哪个http请求框架好用”的文章,当然,你完全可以用这种方法进行http请求的封装。欢迎大家提出宝贵意见。
我在原作者的基础上加了另一种和实现方式,这是github地址 可以去下载看看
引用原文网址:对于有多种可替代解决方案的业务逻辑,提供一种快速更换的思路
【好消息】我的微信公众号正式开通了,关注一下吧!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android建造者模式初探(Toast工具类的进一步封装)
前提 在写这篇文章前一直在思考,我对建造者模式有了一个大体的理解。但是,有没有可能会造成过度封装呢,这里还需要各位看官老爷来评判,如果想看之前的对Toast工具了的封装可以移步Android 自定义Toast,并且勘误Android工具类里面的ToastUtils,有不足之处还望指出。 话不多说先上图 Toast基本显示.png 带图标和改变字体图标大小的toast.png 改变背景颜色的toast.png 改变字体颜色和位置的toast.png 1、先讲一下什么是建造者模式 释义 建造者模式 (BuilderPattern) 又称为生成器模式,该模式主要用于将一个复杂对象的构建与它的表示分离,向用户屏蔽复杂对象组成部分的创建细节,使得同样的构建过程可以创建不同的表示。建造者模式通常包含如下4个角色。 UML图: 建造者模式图 角色介绍 1.Builder:抽象建造者角色,主要为创建产品对象的各组成部分指定抽象接口,一般包含两类方法,其中 buildPartX() 用于创建复杂对象的各部分,此种方法的数量取决于复杂对象组成部分的多少;getResult() 用于返回复杂对象。 2.Co...
- 下一篇
Safari Private 模式下 localStorage 的问题
现如今好多浏览器都有「隐身模式」,Safari 管这叫「Private Browing」,国内各种牌子的套壳浏览器叫「无痕浏览」。私以为从命名上来说,倒是国内更中文一些。 这种模式下浏览网页踏雪无痕,雁过不留声。具体来说,与正常模式的区别是浏览器不会保存历史记录,没有页面缓存,所有本地数据也都是临时的,页面关闭后无法还原。譬如本文下面要讲到的 localStorage。 并不是说这种模式下绝对安全,服务器仍然对用户的浏览是有感知的。所以 IP 什么的依然可以追踪。这世界并不如我们天真设想般烂漫。 --------- LOG --------- 00:01:00 - 一位不具名用户在零点零一分进行了访问 00:02:00 - 一位不愿透露姓名的用户在零点零二分打开了你丢弃在服务器 `社会科学/东方艺术鉴赏/东瀛国浮世绘` 中的资源 `ae2bx86.jpg` 从功能上来说,普通用户大概鲜有人知道这一功能(产品情怀就这样被用户无视,PM 们默默泪目),而开发者则利用其干净的特点来开发调试,排除程序之外的因素导致 bug 的可能。 因为所有本地数据都是临时的,那么问题来了,如果网页代码中还使...
相关文章
文章评论
共有0条评论来说两句吧...