美文网首页
支付业务实战对复杂if else 判断的优化

支付业务实战对复杂if else 判断的优化

作者: java金融 | 来源:发表于2020-04-28 21:13 被阅读0次

背景

最近在做项目的时候,需要接入支付。由于接入第三方支付而且还不知止一家,需要接入很多家。比如说支付宝、微信、富友支付等。每家支付都一个回调。现如今的代码,根据不同的第三方支付一大堆else if判断。现如今代码如下:

 public PayResponse pay(PayRequestType payRequestType) {
        PayTypeEnum payType = PayTypeEnum.para(payRequestType.getPayType());
        if (payType == PayTypeEnum.ALIPAY) {
            return alipayService.pay(payRequestType);
        } else if (payType == PayTypeEnum.WEIXIN) {
            return weixinPayService.pay(payRequestType);
        } else if (payType == PayTypeEnum.LIANLIAN) {
            return lianlianPayService.pay(payRequestType);
        }
        // 其他支付方式
        return null;
    }

如果以后要接入其他的支付方式,然后就要接着else if 往下写,如果十几家怎么办?所以这个要进行优化。

优化步骤

  1. 创建一个支付接口,提供两个方法
public interface Pay {

    PayResponse pay(PayRequestType payRequestType);

    /**
     * 每家支付方式对应的类型
     * @return
     */
    PayTypeEnum getPayType();
}```
每家支付都去实现这个类:比如微信支付

```java
@Component
public class WeixinPayService implements Pay {
    @Override
    public PayResponse pay(PayRequestType payRequestType) {
        return null;
    }

    @Override
    public PayTypeEnum getPayType() {
        return PayTypeEnum.WEIXIN;
    }

然后准备一个工厂把那些判断if else 消除掉

public final class PayFactory {
    private PayFactory() {
    }
    public static Map<PayTypeEnum, Pay> PAYMAP = new ConcurrentHashMap();
    static {
        Map<String, Pay> beansOfType = ApplicationContextHelper.getBeansOfType(Pay.class);
        for (Map.Entry<String, Pay> entry : beansOfType.entrySet()) {
            Pay pay = entry.getValue();
            PAYMAP.put(pay.getPayType(), pay);
        }
    }

    public static Pay getPay(PayTypeEnum payTypeEnum){
        return  PAYMAP.get(payTypeEnum);
    }

spring获取bean帮助类


@Component
public class ApplicationContextHelper implements ApplicationContextAware {

   public static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    public static  <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
        return applicationContext.getBeansOfType(clazz);
    }

优化后代码

类型枚举新增一个枚举转换方法

public enum PayTypeEnum {
    WEIXIN, LIANLIAN, ALIPAY;
  public static PayTypeEnum para(String type){
        for(PayTypeEnum payTypeEnum:PayTypeEnum.values()){
            if(type.equalsIgnoreCase(payTypeEnum.name())){
                return  payTypeEnum;
            }
        }
        return null;
    }
}
  public PayResponse pay2(PayRequestType payRequestType) {
        PayTypeEnum payType = PayTypeEnum.para(payRequestType.getPayType());
       return PayFactory.getPay(payType).pay(payRequestType);
    }

后续新增支付方式的话,只要新增枚举类型、然后实现pay接口就可以了。没有了复杂的if else 判断了。

总结

本文采用了工厂模式和巧用map的形式消除了if else的判断

相关文章

网友评论

      本文标题:支付业务实战对复杂if else 判断的优化

      本文链接:https://www.haomeiwen.com/subject/lgqiwhtx.html