• 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;
        }
    }

    结果:

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

     正常的结果如下:

     

     

     
  • 相关阅读:
    什么是em?
    数据结构与算法:快速排序
    flex中flexshrink的理解
    前端的padding是参照父元素的宽度还是高度?
    子元素的border不能通过百分比设置的
    数据库去重的简易方法
    windows2003 iis6.0站点打不开,找不到服务器或 DNS 错误。
    常用WebServices返回数据的4种方法比较
    手机身份证IP地址开放接口(很实用哦)
    从创业失败中学到的七条教训
  • 原文地址:https://www.cnblogs.com/jimw/p/12227993.html
Copyright © 2020-2023  润新知