策略模式替換switch case

1、業務場景

一個接口須要根據前段傳入的資產類型(assetType),調用不一樣的業務類中的資產明細方法(dealList),最初的作法就是最多見的switch case或者if/else調用不一樣的service。相信每一個程序員看到代碼中大段的判斷邏輯代碼都會很頭疼,恰好以前看過《重構既有代碼》這本Java屆的經典書,裏面就明確指出switch case違反開閉原則,能夠用策略模式改寫。java

2、實現邏輯

1.定義統一資產接口,每種資產實現此接口,代碼以下:程序員

public interface AssetService {
    Integer assetType();

    DealListResponse queryDealList(Integer assetId, Integer status, Integer sinceId, Integer count);
}
複製代碼

2.資產service實現接口,並重寫assetType()和queryDealList()方法,代碼以下:算法

@Service
public class CashService implements AssetService {
    @Autowired
    private CashDetailService cashDetailService;

    @Override
    public Integer assetType() {
        return AssetType.CASH.getId();
    }
	 @Override
    public DealListResponse queryDealList(Integer assetId, Integer status, Integer sinceId, Integer count) {
		   
	 }
    
複製代碼

3.統一分發路由類,根據assetType調用對應的service,代碼以下:ide

@Service
public class AssetServiceRoute {
    @Resource
    private AssetService[] assetServices;


    public AssetService route(Integer assetType) {
        for (AssetService assetService : assetServices) {
            if (Objects.equals(assetType, assetService.assetType())) {
                return assetService;
            }
        }
        throw new BusinessRuntimeException(GiveErrorCode.CHECK_PARAM_FAILED);
    }

}
複製代碼

4.調用,代碼以下;spa

public DealListResponse dealList(Integer assetType, Integer assetId, Integer status, Integer sinceId, Integer count) {
        AssetService assetService = assetServiceRoute.route(assetType);
        if (assetService == null) {
            throw new BusinessRuntimeException(GiveErrorCode.INVALID_PARAMS);
        }
        return assetService.queryDealList(assetId, status, sinceId, count);
    }
複製代碼

3、代碼分析

意圖:定義一系列的算法,把它們一個個封裝起來, 而且使它們可相互替換。 主要解決:在有多種算法類似的狀況下,使用 if...else 所帶來的複雜和難以維護(違反開閉原則)。 什麼時候使用:一個系統有許多許多類,而區分它們的只是他們直接的行爲。 如何解決:將這些算法封裝成一個一個的類,任意地替換。 關鍵代碼:實現同一個接口。code

相關文章
相關標籤/搜索