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

 

结果:

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

 

 正常的结果如下:

 

 

 

 

 

 

 

 

 

 

 
posted @ 2020-01-22 10:13  jimw  阅读(749)  评论(0编辑  收藏  举报