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; } }
结果:
如果是比最初的版本低,则报错
正常的结果如下: