系统与第三方交互时,一般采用Http(s)+xml或webservice。有时出于各种考虑,我们不希望采用Axis等重型手段,相反地,希望以轻量级的方式来实现。但是轻量级的实现方式需要我们手工编写各种代码,随着系统的复杂对提高,我们将遇到各种问题,比如:第三方的API7发生变化;本系统的重复代码块增加;Copy的代码散落各处;各种配置信息无法统一起来;业务的扩展需要调用更多第三方API。
基于这些问题,结合自己的工作经验,我提出如下方案,与大家交流。(由于工作的缘故,并不能把相关源码上传,只能简单描写)
一、了解哪些角色可以帮助系统:
1、 ClientHelper:负责第三方,定义交互的基本流程。比如:采用什么方式传输数据,超时时间多久,序列化和反序列化数据。
2、 Callback:第三方API回调类。定义了第三方API的地址,请求对象,收到正确的数据后如何处理(onResultReceived(Result result))
3、 Config:存放相关的配置信息,但是不是所有的配置信息都在里面
4、 Model:各种请求对象
5、 Factory:根据各种业务要求,生成各种请求对象,
6、 Facade:把第三方API封装成合适系统调用的函数。
二、确认角色之间的交互过程:
1、 ClientHelper使用Callback提供的信息与第三方交互。代码如下:
Public UserRequest getUserRequest(String userId){ UserRequest request = new UserRequest(); request.setUserId(userId); request.setVersion(Config.CurrentVision); return request; }
调用关系如下:
2、 Factory根据Config和业务要求生成各种Model 。交互代码如下:
Public UserRequest getUserRequest(String userId){ UserRequest request = new UserRequest(); request.setUserId(userId); request.setVersion(Config.CurrentVision); return request; }
调用关系如下:
3、 Façade如何根据业务要求,调用第三方API的。交互代码如下:
Public UserInfo getUserInfo(String userId){ UserRequest request = Factory.getUserRequest(userId); CallBack callback = new GetUserCallback(getUserInfoRequest); GetUserResponse response = ClientHelper.doRequest(callback); return new UserInfo(response.getUserId,reponse.getUserName); }
三、如何应对变化:
1、如果需要使用新的API,getLoginHistory,怎么处理?
a) 增加的新的Model:GetLoginHistoryRequest,GetLoginHistoryResponse,
b)给Factory增加新的函数createXXXXRrequest
c)现实新的Callback类:GetLoginHistoryCallback
d) 给Façade,添加一个新函数
2、第三的API的参数发生了变化,如何处理
a)修改相关的model,
b)修改Factory类
3、第三方服务发生更变
a)修改Config的配置信息
四、背后的想法
1、采用【模板+回调】的方式来处与第三方的交互。与第三方的交互流程是不变的,变化的是API。不同的API,其输入,输出都不一样,因此用【回调】把变化的部分总结到一起。
2、使用Factory模式,隐藏各种请求对象的创建过程。
最后,请原谅我的排版和UML图,它们不是很标准,但已经能够表达我的意思!