支付业务优化else if 代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支付业务优化else if 代码相关的知识,希望对你有一定的参考价值。

原创 java金融 java金融 4月12日


背景

最近在做项目的时候,需要接入支付。由于接入第三方支付而且还不止一家,需要接入很多家。比如说支付宝、微信、富友支付等。每家支付都一个回调。现如今的代码,根据不同的第三方支付一大堆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 PayResponse pay2(PayRequestType payRequestType) {
        PayTypeEnum payType = PayTypeEnum.para(payRequestType.getPayType());
       return PayFactory.getPay(payType).pay(payRequestType);
    }

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

以上是关于支付业务优化else if 代码的主要内容,如果未能解决你的问题,请参考以下文章

阿昌之丑陋代码优化多层嵌套if-else

阿昌之丑陋代码优化多层嵌套if-else

JavaSE选择结构——优化if-else的嵌套代码

JavaSE选择结构——优化if-else的嵌套代码

阿昌之丑陋代码优化多分类if-else判断

阿昌之丑陋代码优化多分类if-else判断