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

本文介绍了如何利用SpringBoot的特性,通过策略模式优雅地处理前端传入的codeType值,避免了大量的ifelse或switchcase。具体实现包括创建接口定义执行逻辑,为不同codeType创建实现类,建立枚举映射codeType与服务bean,以及在Controller中通过map注入实现动态调用。这种方式提高了代码的扩展性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

前端传入一个codeType值,根据值的不同去执行对应的逻辑

实现

最简单的就是if else,或者是switch case,这些实现方式确实简单方便,但是造成的后果就是不易扩展维护,今天讲一个利用springboot特性,使用策略模式实现的方法,超简单,超优雅

代码

1.假设codeType的值分别为python, php, java
2.创建接口,给接口添加一个执行逻辑的方法 
/**
 * <h3>demo</h3>
 * <p></p>
 *
 * @author : zyy
 * @date : 2022-06-19 20:51
 **/
public interface CodeTypeService {

    String getResult();

}

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

/**
 * <h3>demo</h3>
 * <p></p>
 *
 * @author : ZhengYangYi
 * @date : 2022-07-12 00:13
 **/
@Service("javaService")
public class JavaServiceImpl implements CodeTypeService{
    @Override
    public String getResult() {
        return "Jaba天下第一";
    }
}
/**
 * <h3>demo</h3>
 * <p></p>
 *
 * @author : ZhengYangYi
 * @date : 2022-07-12 00:13
 **/
@Service("phpService")
public class PhpServiceImpl implements CodeTypeService{
    @Override
    public String getResult() {
        return "Perfect Hair Programming 完美秀发编程";
    }
}
/**
 * <h3>demo</h3>
 * <p></p>
 *
 * @author : ZhengYangYi
 * @date : 2022-07-12 00:13
 **/
@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<String, String> 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类

/**
 * <h3>demo</h3>
 * <p></p>
 *
 * @author : ZhengYangYi
 * @date : 2022-06-19 20:44
 **/
@RestController
@RequestMapping("/test")
public class CodeTypeController {

    @Autowired
    private Map<String, CodeTypeService> 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还可以调整实现类在集合中的位置

具码如下:

具体可以去看这个大佬的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值