策略模式替换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

相关文章
相关标签/搜索