支付業務實戰消除if else

背景

最近在作項目的時候,須要接入支付。因爲接入第三方支付並且還不知止一家,須要接入不少家。好比說支付寶、微信、富友支付等。每家支付都一個回調。現現在的代碼,根據不一樣的第三方支付一大堆else if判斷。現現在代碼以下:java

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 往下寫,若是十幾家怎麼辦?因此這個要進行優化。spring

優化步驟

  1. 建立一個支付接口,提供兩個方法
public interface Pay {

    PayResponse pay(PayRequestType payRequestType);

    /**
     * 每家支付方式對應的類型
     * @return
     */
    PayTypeEnum getPayType();
}

每家支付都去實現這個類:好比微信支付微信

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

    @Override
    public PayTypeEnum getPayType() {
        return PayTypeEnum.WEIXIN;
    }
  1. 而後準備一個工廠把那些判斷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幫助類app

@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);
    }

優化後代碼

類型枚舉新增一個枚舉轉換方法ide

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的判斷。優化

結束

  • 因爲本身才疏學淺,不免會有紕漏,假如你發現了錯誤的地方,還望留言給我指出來,我會對其加以修正。
  • 若是你以爲文章還不錯,你的轉發、分享、讚揚、點贊、留言就是對我最大的鼓勵。
  • 感謝您的閱讀,十分歡迎並感謝您的關注。

在這裏插入圖片描述

相關文章
相關標籤/搜索