使用工厂+策略 解决臃肿的if-else

302 阅读1分钟

实战

需求

实现浏览记录功能,浏览记录包含性能报告,选用攻略以及上榜产品。

浏览记录枚举

public enum BrowsingHistoryType {

    PERFORMANCE_REPORT(1),//性能报告
    SELECTION_STRATEGY(2),//选用攻略
    GOODS(3),//产品

    VALID(0),//有效
    NOTVALID(1);//无效


    private final int statusNum;

    BrowsingHistoryType(int statusNum){
        this.statusNum = statusNum;
    }

    public int getStatusNum(){
        return statusNum;
    }
}

工厂模式实现

public class StrategyFactory {

    private Map<Integer, Strategy> map;

    public StrategyFactory() {

        List<Strategy> strategies = new ArrayList<>();

        strategies.add(new PerformanceRrporeStrategy());
        strategies.add(new SelectionStrategy());
        strategies.add(new GoodsStrategy());

        map = strategies.stream().collect(Collectors.toMap(Strategy::getType, strategy -> strategy));

        /* 等同上面
        map = new HashMap<>();
        for (Strategy strategy : strategies) {
            map.put(strategy.getType(), strategy);
        }*/
    }

    public static class Holder {
        public static StrategyFactory instance = new StrategyFactory();
    }

    public static StrategyFactory getInstance() {
        return Holder.instance;
    }

    public Strategy get(Integer type) {
        return map.get(type);
    }
}

策略模式实现

策略接口

public interface Strategy {

    BrowsingHistoryDto getBrowsingHistory(UserBrowsingHistory userBrowsingHistories);

    int getType();
}

策略具体实现类

public class PerformanceRrporeStrategy implements Strategy{

    @Override
    public BrowsingHistoryDto getBrowsingHistory(UserBrowsingHistory userBrowsingHistories) {
        UserBrowsingHistoryService userBrowsingHistoryService = UserBrowsingHistoryServiceImpl.me();
        BrowsingHistoryDto browsingHistoryDto = userBrowsingHistoryService.getPerformanceRrporeBrowsingHistoryDto(userBrowsingHistories.getRelevanceId());
        browsingHistoryDto.setId(userBrowsingHistories.getId());
        return browsingHistoryDto;
    }

    @Override
    public int getType() {
        return BrowsingHistoryType.PERFORMANCE_REPORT.getStatusNum();
    }
}

public class SelectionStrategy implements  Strategy{

    @Override
    public BrowsingHistoryDto getBrowsingHistory(UserBrowsingHistory userBrowsingHistories) {
        UserBrowsingHistoryService userBrowsingHistoryService = UserBrowsingHistoryServiceImpl.me();
        BrowsingHistoryDto browsingHistoryDto = userBrowsingHistoryService.getSelectionStrategyBrowsingHistoryDto(userBrowsingHistories.getRelevanceId());
        browsingHistoryDto.setId(userBrowsingHistories.getId());
        return browsingHistoryDto;
    }

    @Override
    public int getType() {
        return BrowsingHistoryType.SELECTION_STRATEGY.getStatusNum();
    }

}
public class GoodsStrategy implements Strategy{

    @Override
    public BrowsingHistoryDto getBrowsingHistory(UserBrowsingHistory userBrowsingHistories) {
        UserBrowsingHistoryService userBrowsingHistoryService = UserBrowsingHistoryServiceImpl.me();
        BrowsingHistoryDto browsingHistoryDto = userBrowsingHistoryService.getGoodsBrowsingHistoryDto(userBrowsingHistories.getRelevanceId());
        browsingHistoryDto.setId(userBrowsingHistories.getId());
        return browsingHistoryDto;
    }

    @Override
    public int getType() {
        return BrowsingHistoryType.GOODS.getStatusNum();
    }
}

UserBrowsingHistoryServiceImpl.me()讲解

请看SpringContextHolder 使用