与第三方系统交互的方案设计

 

系统与第三方交互时,一般采用Http(s)+xmlwebservice。有时出于各种考虑,我们不希望采用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、如果需要使用新的APIgetLoginHistory,怎么处理?

          a) 增加的新的ModelGetLoginHistoryRequest,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图,它们不是很标准,但已经能够表达我的意思!

 

猜你喜欢

转载自sing100star.iteye.com/blog/1275431