# Spring實戰系列 - 幹掉 if else

項目開發過程中,有時經常需要根據不同的條件做不同的事情,於是 if else 代碼到處都是,本文就來講講如何優雅幹掉難纏的 if else

先來看看使用 if else 的情況

  • 以支付爲例,代碼如下
@Service
public class PayService {

    /**
     * 支付
     *
     * @param orderInfo
     * @param payType
     * @return
     */
    public boolean pay(Object orderInfo, Integer payType) {

        if (payType == 1) {
            System.out.println("微信支付");
        } else if (payType == 2) {
            System.out.println("支付寶支付");
        } else if (payType == 3) {
            System.out.println("信用卡支付");
        }

        return true;
    }
}
  • 選擇不同的支付方式,進行不同的支付處理,當再接入其他的支付方式,還要在代碼裏面增加判斷,代碼耦合性很高

下面對上面代碼進行改造,如下

  • 對支付抽象一個接口 PayManager
public interface PayManager {

    /**
     * 支付處理
     *
     * @param orderInfo
     * @return
     */
    boolean pay(Object orderInfo);
}
  • 微信支付,支付寶支付,銀行卡支付等均實現該接口,做相應的邏輯處理
// 微信支付邏輯處理類
@Component("payManager1")
public class WeixinPayManager implements PayManager {
    
    @Override
    public boolean pay(Object orderInfo) {
        System.out.println("微信支付");
        return false;
    }
    
}

// 支付寶支付邏輯處理類
@Component("payManager2")
public class AliPayManager implements PayManager {
    
    @Override
    public boolean pay(Object orderInfo) {
        System.out.println("支付寶支付");
        return false;
    }
    
}

// 銀行卡支付邏輯處理類
@Component("payManager3")
public class BankCardPayManager implements PayManager {
    
    @Override
    public boolean pay(Object orderInfo) {
        System.out.println("銀行卡支付");
        return false;
    }
    
}
  • 改造 PayService
@Service
public class PayService {

    @Autowired
    private Map<String, PayManager> payManagerMap;

    /**
     * 支付
     *
     * @param orderInfo
     * @param payType
     * @return
     */
    public boolean pay(Object orderInfo, Integer payType) {

        PayManager payManager = payManagerMap.get("payManager" + payType);

        payManager.pay(orderInfo);

        return true;
    }
}
  • 總結
    • 改造後, PayService 中代碼邏輯清晰,沒有繁瑣的 if else ,以後再接入一種支付方式,只需要新增一個類,並實現 PapManager 接口即可,其他代碼無需修改,符合“開閉原則”
    • 對於 PayService 通過直接注入 private Map<String, PayManager> payManagerMap ,可能有些小夥伴比較陌生,其實這裏 Spring 會查找所有 PayManager 類型的 Bean 實例,並注入到這個Map裏面
    • 可能有的覺得,每種支付方式,都要創建一個類,會造成類越來越多,實際開發過程中,每種支付方式處理,可能涉及邏輯很多,分成不同的類處理比較好,當然也可根據實際情況抽象公共的代碼,本文不再講述
    • 這裏直接使用 payManager1、payManager2、payManager3 ,不太雅觀,小夥伴可通過枚舉映射一下,本文不再講述

  • 本文完,希望對你有幫助
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章