# 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 ,不太雅观,小伙伴可通过枚举映射一下,本文不再讲述

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