工厂类
@Component
public OrderBusinessServiceFactory {
private static final Map<Integer,OrderBusinessMoneyService> CONFIRM_FILE_SERVICE_MAP_BY_TYPE = new HashMap<>(3,1);
@Autowired
public void initService(List<OrderBusinessMoneyService> serviceList) {
serviceList.forEach(service ->CONFIRM_FILE_SERVICE_MAP_BY_TYPE.put(service.getType(), service));
}
public static OrderBusinessMoneyService getOrderBusinessService(Integer type) {
return Optional.ofNullable(CONFIRM_FILE_SERVICE_MAP_BY_TYPE.get(type))
.orElseThrow(() -> new IllegalArgumentException("根据订单类型获取对应service异常:" + type));
}
Service
public interface OrderBusinessMoneyService {
Integer getType();
List<Order> getBusinessOrderRecordList(List<Integer> orderIds) throws Exception;
BusinessResponse getBusinessResponse(String orderUuid) throws Exception;
default void decorateResult(BusinessResponse result,List<Order> records){
}
}
举两个实现类型,对应两种订单类型A和B
@Service
public class AOrderBusinessServiceImpl implements OrderBusinessService {
@Resource
private AOrderRecordMapper aOrderRecordMapper;
public static final int A_TYPE = 1;
@Override
public BusinessResponse getBusinessResponse(String orderUuid) throws Exception {
List<Integer> orderIds = aOrderRecordMapper.selectOrderIdsByUuid(orderUuid);
List<Order> orderList = getBusinessOrderRecordList.(orderIds);
return decorateResult(new BusinessResponse(),orderList);
}
@Override
public List<Order> getBusinessOrderRecordList(List<Integer> orderIds) throws Exception {
return aOrderRecordMapper.selectOrders(orderIds);
}
}
@Service
public class BOrderBusinessServiceImpl implements OrderBusinessService {
@Resource
private BOrderRecordMapper bOrderRecordMapper;
public static final int B_TYPE = 2;
@Override
public BusinessResponse getBusinessResponse(String orderUuid) throws Exception {
List<Integer> orderIds = bOrderRecordMapper.selectOrderIdsByUuid(orderUuid);
List<Order> orderList = getBusinessOrderRecordList.(orderIds);
return decorateResult(new BusinessResponse(),orderList);
}
@Override
public List<Order> getBusinessOrderRecordList(List<Integer> orderIds) throws Exception {
return bOrderRecordMapper.selectOrders(orderIds);
}
}
controller层调用
@Override
@GetMapping("getBusinessResponse")
public Result(BusinessResponse) getBusinessResponse (@RequestParam("orderUuid") String orderUuid,@RequestParam("type") Integer type) {
OrderBusinessService businessService = OrderBusinessServiceFactory.getOrderBusinessService(type);
return new Result(Http.OK.value, businessService.getBusinessResponse(
Optional.ofNullable(orderUuid).orElseThrow(() -> new BaseException("参数不可以为空"))
));
}