{
return Result.success(userInfoTargetService.queryData(userId, type));
}
}
定义统一的输出的类DataInfoVo
,这里定义的字段需要暴露给前端,具体业务意义跟前端商定。
/**
* @author 往事如风
* @version 1.0
* @date 2023/5/10 14:40
* @description
*/
@Data
public class DataInfoVo {
/**
* 名称
*/
private String name;
/**
* 类型
*/
private String type;
/**
* 预留字段:具体业务意义自行定义
*/
private Object extInfo;
}
然后,定义Target接口(篇幅原因,这里不做展示),Adapter适配器类,这里采用的是对象适配器,由于单继承的限制,对象适配器也是最常用的适配器模式。
/**
* @author 往事如风
* @version 1.0
* @date 2023/5/10 15:09
* @description
*/
@Service
@RequiredArgsConstructor
public class UserInfoAdapter implements UserInfoTargetService {
/**
* 源数据类管理器
*/
private final AdapteeManager adapteeManager;
@Override
public DataInfoVo queryData(Integer userId, String type) {
// 根据类型,得到唯一的源数据类
UserBaseAdaptee adaptee = adapteeManager.getAdaptee(type);
if (Objects.nonNull(adaptee)) {
Object data = adaptee.getData(userId, type);
return adaptee.convert(data);
}
return null;
}
}
这里定义了一个AdapteeManager
类,表示管理Adaptee
类,内部维护一个map,用于存储真实Adaptee
类。
/**
* @author 往事如风
* @version 1.0
* @date 2023/5/10 15:37
* @description
*/
public class AdapteeManager {
private Map<String, UserBaseAdaptee> baseAdapteeMap;
public void setBaseAdapteeMap(List<UserBaseAdaptee> adaptees) {
baseAdapteeMap = adaptees.stream()
.collect(Collectors.toMap(handler -> AnnotationUtils.findAnnotation(handler.getClass(), Adapter.class).type(), v -> v, (v1, v2) -> v1));
}
public UserBaseAdaptee getAdaptee(String type) {
return baseAdapteeMap.get(type);
}
}
最后,按照数据类型,定义了三个Adaptee类:AllowanceServiceAdaptee
(津贴)、BusinessServiceAdaptee
(企业工商)、UserAccountServiceAdaptee
(用户账户)。
/**
* @author 往事如风
* @version 1.0
* @date 2023/5/10 15:00
* @description
*/
@Adapter(type = "JT")
public class AllowanceServiceAdaptee implements UserBaseAdaptee {
@Override
public Object getData(Integer userId, String type) {
// 模拟调用外部api,查询津贴信息
AllowanceVo allowanceVo = new AllowanceVo();
allowanceVo.setAllowanceType("管理津贴");
allowanceVo.setAllowanceAccount("xwqeretry2345676");
allowanceVo.setAmount(new BigDecimal(20000));
return allowanceVo;
}
@Override
public DataInfoVo convert(Object data) {
AllowanceVo preConvert = (AllowanceVo) data;
DataInfoVo dataInfoVo = new DataInfoVo();
dataInfoVo.setName(preConvert.getAllowanceAccount());
dataInfoVo.setType(preConvert.getAllowanceType());
dataInfoVo.setExtInfo(preConvert.getAmount());
return dataInfoVo;
}
}
/**
* @author 往事如风
* @version 1.0
* @date 2023/5/10 15:00
* @description
*/
@Adapter(type = "QY")
public class BusinessServiceAdaptee implements UserBaseAdaptee {
@Override
public Object getData(Integer userId, String type) {
// 模拟调用外部api,查询企业工商信息
BusinessVo businessVo = new BusinessVo();
businessVo.setBusName("xxx科技有限公司");
businessVo.setBusCode("q24243Je54sdfd99");
businessVo.setBusType("中大型企业");
return businessVo;
}
@Override
public DataInfoVo convert(Object data) {
BusinessVo preConvert = (BusinessVo) data;
DataInfoVo dataInfoVo = new DataInfoVo();
dataInfoVo.setName(preConvert.getBusName());
dataInfoVo.setType(preConvert.getBusType());
dataInfoVo.setExtInfo(preConvert.getBusCode());
return dataInfo