zoukankan      html  css  js  c++  java
  • spring boot 工厂+策略模式实现版本控制

    目前我们在用的技术方案是策略模式,在APP发包的时候,每次都是需要在当前版本迭代往上加,然而每次发包的内容并非覆盖所有功能的,有些功能是复用兼容旧版本。

    因此是从class的name+版本好进行判断处理业务逻辑。比如8.0的版本是初版,那么8.0.1++往上叠加,若判断该版本是有新的功能迭代,那么就直接引用新版本的功能,若无,则向下兼容旧版本,比如我的版本出到了8.0.2,8.0.2是不需要加功能的,那么8.0.1已经出了一个版本迭代功能,比8.0.0的版本高,那么是优先拿8.0.1的功能的。

    从而代码量是比工厂策略模式复杂的。因此综合进行升级了一波。

    工厂类:

    /**
     * @author jimw
     * @date 2020-1-21
     * 工厂策略模式
     */
    @Service
    @Log4j2
    public class FactoryForStrategy {
    
    
        @Autowired
        Map<String, Strategy> strategys = new ConcurrentHashMap<>(3);
    
        public Strategy getStrategy(String version) throws Exception {
            Strategy strategy = strategys.get(version);
    
            if (strategy == null) {
                strategy = strategyGet(version);
                if (strategy != null) {
                    return strategy;
                }
                throw new RuntimeException("no strategy defined");
            }
            return strategy;
        }
    
        public Strategy strategyGet(String version) {
            List<Map.Entry<String, Strategy>> list = new ArrayList(strategys.entrySet());
            Comparator<Map.Entry<String, Strategy>> ageComparator = Comparator.comparing(Map.Entry::getKey);
            list.sort(ageComparator.reversed());
    
            for (Map.Entry<String, Strategy> strategyEntry :
                    list) {
                //比当前版本高 则跳过
                if (version.compareTo(strategyEntry.getKey()) > 0) {
                    if (strategys.get(strategyEntry.getKey()) == null) {
                        return strategyGet(strategyEntry.getKey());
                    }
                    return strategys.get(strategyEntry.getKey());
                }
    
            }
            return null;
        }
    }
    /**
     *
     * @author jimw
     * @date 2020-1-21
     * 实现接口方法
     */
    public interface Strategy {
        String doOperation();
    }

    实现:

    /**
     *
     * @author jimw
     * @date 2020-1-21
     * 实现
     */
    @Component("8.0.0")
    public class StrategyOne implements Strategy {
        @Override
        public String doOperation() {
            return "8.0.0";
        }
    }
    
    /**
     *
     * @author jimw
     * @date 2020-1-21
     * 版本区分实现
     */
    @Component("8.0.3")
    public class StrategyThree extends StrategyTwo {
    
        @Override
        public String doOperation() {
            return "8.0.3";
        }
    }
    /**
     *
     * @author jimw
     * @date 2020-1-21
     * 版本区分实现
     */
    @Component("8.0.2")
    public class StrategyTwo extends StrategyOne {
    //不做动作也可以,该类不写也可以
    
    }

    demo:

    /**
     * @author jimw
     * @date 2020-1-21
     * demo
     */
    @RestController
    public class StrategyController {
    
        @Autowired
        FactoryForStrategy factoryForStrategy;
    
        @PostMapping("/strategyTest")
        @ResponseBody
        public String strategy(@RequestParam("version") String version) {
            String result;
            try {
                result = factoryForStrategy.getStrategy(version).doOperation();
            } catch (Exception e) {
                result = e.getMessage();
            }
            return result;
        }
    }

    结果:

    如果是比最初的版本低,则报错

     正常的结果如下:

     

     

     
  • 相关阅读:
    1386. 安排电影院座位
    1123. 最深叶节点的最近公共祖先
    375. 猜数字大小 II
    未能在system.drawing中找到bitmap
    856. 括号的分数
    140. 单词拆分 II
    5909. 并行课程 III
    typora + ImgHosting (一款不会存储图片的图床实现)
    IDEA插件:search with bing、search with baidu
    多吉搜索美化
  • 原文地址:https://www.cnblogs.com/jimw/p/12227993.html
Copyright © 2011-2022 走看看