现状
if else 逻辑处理,当每个分支的处理逻辑复杂且经常变换时,代码臃肿,修改困难…
PayServiceImpl类部分if else:
//根据支付方式调用不同服务逻辑
String payType = payVo.getPayType();
if (WECHAT.equals(payType)) {
log.info("微信支付逻辑处理开始...");
} else if (ALIPAY.equals(payType)) {
log.info("支付宝支付逻辑处理开始...");
} else if (UNIONPAY.equals(payType)) {
log.info("银联支付逻辑处理开始...");
} else {
throw new ServiceException(ExceptionEnum.NOT_PAYTYPE);
}
参考方案
- 策略模式 springboot @Autowired + map自动注入
- 定义支付处理接口
public interface PayHandler {
void handlePay(PayVo payVo);
}
- 新增支付处理接口的实现类
微信支付处理类
@Component
@Slf4j
public class WechatPay implements PayHandler {
@Override
public void handlePay(PayVo payVo) {
log.info("微信支付逻辑处理开始...");
}
}
支付宝支付处理类
@Component
@Slf4j
public class Alipay implements PayHandler {
@Override
public void handlePay(PayVo payVo) {
log.info("支付宝支付逻辑处理开始...");
}
}
银联支付处理类
@Component
@Slf4j
public class UnionPay implements PayHandler {
@Override
public void handlePay(PayVo payVo) {
log.info("银联支付逻辑处理开始...");
}
}
- 在PayServiceImpl注入
@Autowired
private Map<String, PayHandler> payMap = new ConcurrentHashMap<>();
- 根据payType调用不同处理类
//根据支付方式调用不同服务逻辑
String payType = payVo.getPayType();
PayHandler payHandler = payMap.get(payType);
Assert.notNull(payHandler, "can not find PayHandler by payType=" + payType);
payHandler.handlePay(payVo);
end.
- 策略模式 springboot -> lambda
- 将if else 抽离到新的处理类FunctionPayService中,每个分支抽为一个方法
@Component
@Slf4j
public class FunctionPayService {
public String weChatPay(PayVo payVo) {
log.info("微信支付逻辑处理开始...");
return "微信支付成功";
}
public String alipay(PayVo payVo) {
log.info("支付宝支付逻辑处理开始...");
return "支付宝支付成功";
}
public String unionPay(PayVo payVo) {
log.info("银联支付逻辑处理开始...");
return "银联支付成功";
}
}
- 在PayServiceImpl类中注入FunctionPayService ,并定义payType与Function的映射Map
@Autowired
private FunctionPayService functionPayService;
private Map<String, Function<PayVo, String>> functionMap = new ConcurrentHashMap<>();
@PostConstruct
public void init() {
functionMap.put(WECHAT, payVo -> functionPayService.weChatPay(payVo));
functionMap.put(ALIPAY, payVo -> functionPayService.alipay(payVo));
functionMap.put(UNIONPAY, payVo -> functionPayService.unionPay(payVo));
}
- 根据payType得到不同的Function,apply执行对于的处理逻辑
//根据支付方式调用不同服务逻辑
String payType = payVo.getPayType();
Function<PayVo, String> payFunction = functionMap.get(payType);
Assert.notNull(payFunction, "can not find payFunction by payType=" + payType);
payFunction.apply(payVo);
end.