# Spring實戰(zhàn)系列 - 打倒 if else

項目開發(fā)過程中,有時經(jīng)常需要根據(jù)不同的條件做不同的事情,于是 if else 代碼到處都是,本文就來講講如何優(yōu)雅干掉難纏的 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;
    }
}
  • 選擇不同的支付方式,進(jìn)行不同的支付處理,當(dāng)再接入其他的支付方式,還要在代碼里面增加判斷,代碼耦合性很高

下面對上面代碼進(jìn)行改造,如下

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

    /**
     * 支付處理
     *
     * @param orderInfo
     * @return
     */
    boolean pay(Object orderInfo);
}
  • 微信支付,支付寶支付,銀行卡支付等均實現(xiàn)該接口,做相應(yīng)的邏輯處理
// 微信支付邏輯處理類
@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;
    }
}
  • 總結(jié)
    • 改造后, PayService 中代碼邏輯清晰,沒有繁瑣的 if else ,以后再接入一種支付方式,只需要新增一個類,并實現(xiàn) PapManager 接口即可,其他代碼無需修改,符合“開閉原則”
    • 對于 PayService 通過直接注入 private Map<String, PayManager> payManagerMap ,可能有些小伙伴比較陌生,其實這里 Spring 會查找所有 PayManager 類型的 Bean 實例,并注入到這個Map里面
    • 可能有的覺得,每種支付方式,都要創(chuàng)建一個類,會造成類越來越多,實際開發(fā)過程中,每種支付方式處理,可能涉及邏輯很多,分成不同的類處理比較,當(dāng)然也可根據(jù)實際情況抽象公共的代碼,本文不再講述
    • 這里直接使用 payManager1、payManager2、payManager3 ,不太雅觀,小伙伴可通過枚舉映射一下,本文不再講述

  • 本文完,希望對你有幫助
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容