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...的邏輯判斷的堆砌。