需求
前端传入一个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还可以调整实现类在集合中的位置
具码如下: