栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用Springboot实现策略模式,减少if else语句

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Springboot实现策略模式,减少if else语句

需求
前端传入一个codeType值,根据值的不同去执行对应的逻辑
实现
最简单的就是if else,或者是switch case,这些实现方式确实简单方便,但是造成的后果就是不易扩展维护,今天讲一个利用springboot特性,使用策略模式实现的方法,超简单,超优雅
代码
1.假设codeType的值分别为python, php, java
2.创建接口,给接口添加一个执行逻辑的方法 
public interface CodeTypeService {

    String getResult();

}

3.创建3个实现类,每个类去实现各自的逻辑

@Service("javaService")
public class JavaServiceImpl implements CodeTypeService{
    @Override
    public String getResult() {
        return "Jaba天下第一";
    }
}
@Service("phpService")
public class PhpServiceImpl implements CodeTypeService{
    @Override
    public String getResult() {
        return "Perfect Hair Programming 完美秀发编程";
    }
}
@Service("pythonService")
public class PythonServiceImpl implements CodeTypeService{
    @Override
    public String getResult() {
        return "Life is short, You need Python";
    }
}

4.写一个枚举用于映射codeType和上述三个bean名称对应(也可以直接给bean取名为codeType对应的类型名字,这样可以不用写枚举,不过为了让代码有一个更好的扩展,咱建一个枚举来映射)

public enum CodeTypeEnum {

    JAVA("java", "javaService"),

    PHP("php", "phpService"),

    Python("python", "pythonService");

    final String codeType;
    final String beanName;

    CodeTypeEnum(String codeType, String beanName) {
        this.codeType = codeType;
        this.beanName = beanName;
    }

    private static final Map nameMap;

    static {
        nameMap = new HashMap<>(CodeTypeEnum.values().length);
        for (CodeTypeEnum codeTypeEnum : CodeTypeEnum.values()) {
            nameMap.put(codeTypeEnum.codeType, codeTypeEnum.beanName);
        }
    }
    
    public static String getBeanName(String codeType) {
        return nameMap.get(codeType);
    }
}

5.创建Controller类

@RestController
@RequestMapping("/test")
public class CodeTypeController {

    @Autowired
    private Map map;

    @GetMapping("/getResult")
    public String getResult(@RequestParam("codeType") String codeType) {
        String beanName = CodeTypeEnum.getBeanName(codeType);
        CodeTypeService service = map.get(beanName);
        return service.getResult();
    }
}

6.测试



7.到此大功告成,可能就有小伙伴疑惑了,控制层注入一个map,啥也没干,怎么就可以使用了,这就要归功于springboot了,它在启动的时候会判断注入类型,如果注入一个map,就会去寻找map中value的实现子类,并以bean名字作为注入map的key,bean的实例作为value
ps:也可以注入一个List集合,springboot也会自动将所有实现类加入集合,使用@Order还可以调整实现类在集合中的位置

具码如下:

具体可以去看这个大佬的

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1014343.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号