springboot 策略+工廠模式優化if..else..

1.策略接口

public interface IStrategy {

    /**
     * 根據id獲取對應數據
     * @param dispatchQuery
     */
    <T> T getData(QueryParams queryParams);
}

2. 策略工廠

@Component
public class StrategyFactory {
    /**
     * 關鍵功能 Spring 會自動將 EntStrategy 接口的類注入到這個Map中
     */

    @Autowired
    private Map<String, IStrategy> strategies = new ConcurrentHashMap<>();

    public IStrategy getStrategy(String graphId){
        IStrategy strategy = strategies.get(graphId);
        if(null == strategy) {
            throw new BizException(ResultEnum.STRATEGY_NOT_EXITS);
        }

        return strategy;
    }
}

這裏的strategies map用@Autowired修飾, spring IOC會自動將實現Istragety的類put到該map中,這裏就是本文的關鍵,你品,細品!建議看相關源碼搞清楚

3.具體的策略類

@Component("one")
public class OneStrategy implements IStrategy {
 //TODO
}

這時候的OnStrategy已然在上文中的map中

4.上下文

@Component
public class DispatchCtx {

    @Autowired
    private StrategyFactory strategyFactory;

    public <T> T getData(DispatchQuery dispatchQuery) {
        if (StringUtils.isEmpty(dispatchQuery)) {
            throw new BizException(ResultEnum.STRATEGY_NOT_EXITS);
        }

        IStrategy strategy = strategyFactory.getStrategy(dispatchQuery.getGraphId());
        return strategy.getGraphData(dispatchQuery);
    }

}

5.替換原來的if...else...

 for (String id: graphIds) {
            QueryParams query = QueryParams();
            query .setStrategyId(id);
            Map graphMap = dispatchCtx.getGraphData(query );
            list.add((T) graphMap);
        }

總結:該實現主要運用了java泛型及工廠+策略模式,擺脫了原來的if...else...的邏輯判斷的堆砌。

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