前言
java有很多设计模式,在平时写代码中可能无意识的就用到了,但是又叫不出这个是什么模式,这里介绍一个策略模式。
场景
在开发过程中,遇到了很多次调用第三方接口,每次都需要创建一个client去调用,于是就想能不能抽象一下,把他们做成一个模板,每个接口都可以找到属于自己的一个分类,再通过这个统一的分类进行接口的调用。
实践
有了实际需求,就可以开始找寻方法了。
首先是将调用第三方接口的过程拆分成三部分,创建接口参数,调用第三方接口,获取接口返回值。
先看看最开始的调用吧:
分析一下这三部分:
构建参数和接口调用可以合并到一起,因为他们之间就隔了一个execute方法。
获取返回值最好是隔开,返回值大多数情况下都是一个json字符串,不同的接口返回值不一样,可能某些接口是code;msg;data的格式,有的又是code;msg;result等等,如果直接写成固定获取data或者result肯定是不行的。所以这一部分单独开来。
通过okhttp进行调用的话,最终是通过response.body来获取返回值的,就像上面说的,根据实际情况来获取返回值中特定的那一部分。
所以在经过思考之后,将参数构建和调用接口放到一起,再考虑到不同接口需要不同的参数,不同类型的接口也需要不同的处理方式,于是得到了下面的结构。
参数构建类
大多数情况下,body参数就够用了,能够转json,也能够构建键值对。
接口调用类
自定义一个类,实现这个接口,重写里面的方法即可。优点是可以根据不同的入参,不同的接口方式来生成不同的实现类。
下面是一个范例,专门处理get请求,表单提交类的接口,getquerystring主要的功能是把入参拼接再url后面,形成真正的url。
对于postjson提交也是一样的。创建一个请求体就成。
方法调用类
在这个类里面有一个初始化就存在的client,能够解决以往调用一次第三方,就创建一次client的弊端,只需要创建一个client。
同时这个类只执行了一个接口调用,并将返回值返回的功能,理由则是不同的接口返回值的字段可能不一样,没办法做到绝对通用,而且考虑到接口调用失败等情况,不适合在这里做返回值处理,所以这里返回接口调用结果的json对象。
使用范例
这里首先是获取登陆用的token,然后构建了一个请求体,将入参付给了call对象,通过接口调用类创建了一个请求,交给execute执行,最终判断接口响应结果,成功则获取返回值,失败则不做处理。
写在最后
定义一个接口让别的类去实现它,看似多了一步,但实际上是再规范代码,让后续的类似功能都按照这个模板进行,一定程度上避免了百花齐放。此外,新的接口也未必不能复用旧的类,根据实际情况进行判断,例如call对象中有一个datachar,这个字段是用来获取最后响应体对应的数据,有的接口使用result存放,有的使用data存放,这里就是一个拓展的地方,不管第三方用什么存放,可以随时更改这个。
第二个就是,出参最好是自己转换一下。上面范例中先是将返回的对象转成了obj,再经由hutool工具包进行转换,这一道是为了防止对面的返回值发生变化,比如字段增减之类的,可能会导致转换失败,而先转成obj再转成需要的对象的话,就能够避免这个问题。缺少的参数会被赋为null,增加的参数会被无视,一定程度上能够避免一些问题,而且后续修改的话也只需要修改类中的参数就行了,不需要对别的代码进行修改。