使用策略模式替换if else 的实践

现状

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自动注入
  1. 定义支付处理接口
public interface PayHandler {
    void handlePay(PayVo payVo);
}
  1. 新增支付处理接口的实现类

微信支付处理类

@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("银联支付逻辑处理开始...");
    }
}
  1. 在PayServiceImpl注入
@Autowired
private Map<String, PayHandler> payMap = new ConcurrentHashMap<>();
  1. 根据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
  1. 将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 "银联支付成功";
    }
}

  1. 在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));
}
  1. 根据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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wetools.online

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值