一、概述
外呼业务场景中,有一个关键的接口就是黑名单接口(包括客户投诉、退订接口、是否还款等),我们系统需要经常去跟外部第三方系统交互(http方式)。
一个请求都会经历这几个流程:
- 查询商户信息(token、url等)
- 对请求报文加签
- 发送http请求出去
- 对返回的报文验签
这里,有的商户可能是走代理出去的,有的是走直连。假设当前有A,B客户接入,一般可能这么实现,伪代码如下:
// 客户A处理句柄
CompanyAHandler implements RequestHandler {
Resp hander(req){
//查询商户信息
queryMerchantInfo();
//加签
signature();
//http请求(A商户假设走的是代理)
httpRequestbyProxy()
//验签
verify();
}
}
// 客户B处理句柄
CompanyBHandler implements RequestHandler {
Resp hander(Rreq){
//查询商户信息
queryMerchantInfo();
//加签
signature();
// http请求(B商户不走代理,直连)
httpRequestbyDirect();
// 验签
verify();
}
}
二、调用第三方系统接口的设计
随着业务发展,客户越来越多,新加一个C商户接入,你需要再实现一套这样的代码。显然,这样代码就重复了,一些通用的方法,却在每一个子类都重新写了这一方法。这里就可以使用模板方法模式。
模板方法模式:定义一个 *** 作中的算法的骨架流程,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。它的核心思想就是:定义一个 *** 作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现,这样不同的子类就可以定义出不同的步骤。
- 一个抽象类,定义骨架流程(抽象方法放一起)
- 确定的共同方法步骤,放到抽象类(去除抽象方法标记)
- 不确定的步骤,给子类去差异化实现
2.1、定义一个抽象类,包含请求流程的几个方法,方法首先都定义为抽象方法
/**
* 抽象类定义骨架流程(查询商户信息,加签,http请求,验签)
*/
abstract class AbstractMerchantService {
//查询商户信息
abstract queryMerchantInfo();
//加签
abstract signature();
//http 请求
abstract httpRequest();
// 验签
abstract verifySinature();
}
2.2 、确定的共同方法步骤,放到抽象类
abstract class AbstractMerchantService {
//模板方法流程
Resp handlerTempPlate(req){
//查询商户信息
queryMerchantInfo();
//加签
signature();
//http 请求
httpRequest();
// 验签
verifySinature();
}
// Http是否走代理(提供给子类实现)
abstract boolean isRequestByProxy();
}
2.3、不确定的步骤,给子类去差异化实现
客户A的请求实现:
CompanyAServiceImpl extends AbstractMerchantService{
Resp hander(req){
return handlerTempPlate(req);
}
//走http代理的
boolean isRequestByProxy(){
return true;
}
客户B的实现:
CompanyBServiceImpl extends AbstractMerchantService{
Resp hander(req){
return handlerTempPlate(req);
}
//公司B是不走代理的
boolean isRequestByProxy(){
return false;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)