spring boot 工厂+策略模式实现APP版本控制

目前我们在用的技术方案是策略模式,在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;
    }
}

结果:

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

正常的结果如下:

原文地址:https://www.cnblogs.com/jimw/p/12227993.html

时间: 2024-08-11 03:23:00

spring boot 工厂+策略模式实现APP版本控制的相关文章

简单工厂+策略模式-下

前言: 虽然做了个Demo但是实际应用的时候发现一开始对简单工厂与策略的理解有误差.开始想输入时间和基础数据就根据不同的算法算出来.后来发现不是.其实时间也是计算的数据.真正选择算法的是像固定用户和临时用户.或者说打折促销.根据这个. 深夜食堂 一个在深夜12点到凌晨7点开张的小食店.被大家称谓深夜食堂.菜单上只有一样菜.但是.无论你要点什么.只要老板会做.即使菜单上没有的菜也可以点.所以.客人还真不少呢. 日式滑动的木门被打开.进来的是一个浑身又绿色.有着硬壳的家伙.没错.他是富兰克林.老板,

代码重构:用工厂+策略模式优化过多的if else代码块

最近在工作中优化了一段冗余的if else代码块,感觉对设计模式的理解和运用很有帮助,所以分享出来.鉴于原代码会涉及到公司的隐私,因此就不贴出来了.下面以更加通俗易懂的案例来解析. 假如写一个针对员工上班不遵守制度做相应惩罚的程序,比如,上班迟到:罚100:上班睡觉:罚1000:上班早退:警告:上班玩游戏:严重警告:上班谈恋爱:开除等,通常都会这样写: public class WorkPunish { public static void main(String[] agrs){ String

简单工厂+策略模式-上

http://www.biquge.cc/html/156/156282/22734698.html http://www.biquge.cc/html/156/156282/22734700.html http://www.biquge.cc/html/156/156282/22734702.html http://www.biquge.cc/html/156/156282/22734704.html http://www.biquge.cc/html/156/156282/22734706.

spring中策略模式使用

策略模式 工作中经常使用到策略模式+工厂模式,实现一个接口多种实现的灵活调用与后续代码的扩展性.在spring中使用策略模式更为简单,所有的bean均为spring容器管理,只需获取该接口的所有实现类即可. 下面以事件处理功能为例,接收到事件之后,根据事件类型调用不同的实现接口去处理.如需新增事件,只需扩展实现类即可,无需改动之前的代码.这样即做到了功能的隔离,又可防止改动原代码导致的bug. 类图 代码示例 定义接口 public interface IBaseEventService { /

“模”法无边—策略模式+简单工厂实现下机收费

下机收费是一种算法,临时用户和学生下机下机就是两种算法,让我想到了使用策略模式,根据是否为临时用户和学生,选择具体的算法,这属于简单工厂,好的,简单工厂+策略模式实现下机收费 策略类-封装具体的策略   '封装具体的算法,需要引用一个算法 Public Class consumeContext     Dim strategyconsume As Consume       Sub New(ByRef strategy As Consume)         Me.strategyconsume

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介

【LabVIEW技巧】策略模式

前言 在之前的文章中,我们提到了如何学习OOP以及对应的简单工厂模式,由于时间比较长,我们先回顾一下之前讲到的一些内容,然后继续了解策略模式. 为什么学习OOP 在测控系统的软件开发过程中,我们LabVIEW工程师一直认为程序完成功能就可以了,但是随着程序的越来越复杂,我们发现很多情况下成型系统到后期无法添加功能或很难添加功能. 是什么阻碍了我们软件系统的开发?为什么在需求沟通不明确的前期,我们无法开发软件:在需求明确的后期,又无法对软件进行灵活修改. 如果大家仔细分析中国的四大发明,就会发现活

spring boot入门

一.对spring boot的解释:(百度百科) Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 二.我用的是idea开发工具(建议使用idea开发,用着比较舒服),用的是maven. 三.idea创建新的