一、分析
外部的完成之后就开始具体的通道了,首先通道是有多个的,所以要定义出一个接口,具体的通道实现这些接口,完成自己的内部处理。
二、接口的定义
接口定义出三个方法
- 创建订单
- 查询订单
- 获取通道类型
代码如下
public interface PassProcessor {
PassCreateOrderBo createOrder(String appId, String appKey, String orderNo, String name, String idNo, String callbackUrl);
PassQueryOrderBo queryOrder(String appId, String appKey, String orderNo);
PassType getPassType();
}
这里说明下第三个接口:获取通道类型,因为每个接口的实现就是一种通道的实现,如果不加这个接口,那么调用的人不知道是实现的哪个通道,所以要让实现类自己告诉调用者,我实现了哪个通道
三、接口的实现
- 腾讯的实现
@Component
public class TencentProcessor implements PassProcessor {
@Override
public PassCreateOrderBo createOrder(String appId, String appKey, String orderNo, String name,
String idNo, String callbackUrl) {
return new PassCreateOrderBo(orderNo, "https://www.tencent.com");
}
@Override
public PassQueryOrderBo queryOrder(String appId, String appKey, String orderNo) {
return new PassQueryOrderBo(true, true);
}
@Override
public PassType getPassType() {
return PassType.TENCENT;
}
}
- 阿里的实现
@Component
public class AlibabaProcessor implements PassProcessor {
@Override
public PassCreateOrderBo createOrder(String appId, String appKey, String orderNo, String name,
String idNo, String callbackUrl) {
return new PassCreateOrderBo(orderNo, "https://www.alibaba.com");
}
@Override
public PassQueryOrderBo queryOrder(String appId, String appKey, String orderNo) {
return new PassQueryOrderBo(true, true);
}
@Override
public PassType getPassType() {
return PassType.ALIBABA;
}
}
四、配置
这些实现类怎么调用呢,这里用spring的Configuration的配置Bean来实现,代码如下
@Configuration
public class PassProcessorConfig {
@Autowired
private List<PassProcessor> passProcessorList;
@Bean
public Map<PassType, PassProcessor> passProcessorMap() {
return passProcessorList.stream().collect(
Collectors.toMap(key -> key.getPassType(), value -> value));
}
}
把所有的实现类放到map里,通道类型作为key,通道的实现作为value
五、调用
还在最外层的FaceRecognitionService调用,代码如下
@Component
public class FaceRecognitionService {
@Autowired
private PassInfoService passInfoService;
@Autowired
private Map<PassType, PassProcessor> passProcessorMap;
/**
* 创建订单
* @param orderNo
* @param passNo
* @param name
* @param idNo
* @param callbackUrl
* @return
*/
public CreateOrderBo createOrder(String orderNo, String passNo, String name, String idNo, String callbackUrl) {
PassInfo passInfo = passInfoService.getInfo(passNo);
String appId = passInfo.getAppId();
String appKey = passInfo.getAppKey();
PassType passType = passInfo.getPassType();
PassProcessor passProcessor = passProcessorMap.get(passType);
PassCreateOrderBo passCreateOrderBo = passProcessor.createOrder(appId, appKey, orderNo, name, idNo,
callbackUrl);
return new CreateOrderBo(passCreateOrderBo.getOrderNo(), passCreateOrderBo.getH5Url());
}
/**
* 查询订单
* @param orderNo
* @param passNo
* @return
*/
public QueryOrderBo queryOrder(String orderNo, String passNo) {
PassInfo passInfo = passInfoService.getInfo(passNo);
String appId = passInfo.getAppId();
String appKey = passInfo.getAppKey();
PassType passType = passInfo.getPassType();
PassProcessor passProcessor = passProcessorMap.get(passType);
PassQueryOrderBo passQueryOrderBo = passProcessor.queryOrder(appId, appKey, orderNo);
return new QueryOrderBo(passQueryOrderBo.isPass(), passQueryOrderBo.isCharge());
}
}
六、配置config类
在resources下MET-INF下的spring.factories加上config类的路径
# 自动装配
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.starter.example.config.PassProcessorConfig