一個接口須要根據前段傳入的資產類型(assetType),調用不一樣的業務類中的資產明細方法(dealList),最初的作法就是最多見的switch case或者if/else調用不一樣的service。相信每一個程序員看到代碼中大段的判斷邏輯代碼都會很頭疼,恰好以前看過《重構既有代碼》這本Java屆的經典書,裏面就明確指出switch case違反開閉原則,能夠用策略模式改寫。java
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);
}
複製代碼
意圖:定義一系列的算法,把它們一個個封裝起來, 而且使它們可相互替換。 主要解決:在有多種算法類似的狀況下,使用 if...else 所帶來的複雜和難以維護(違反開閉原則)。 什麼時候使用:一個系統有許多許多類,而區分它們的只是他們直接的行爲。 如何解決:將這些算法封裝成一個一個的類,任意地替換。 關鍵代碼:實現同一個接口。code