实际工作中,我们经常会遇到需要根据入参的不同,调用不同的实现。而如何优雅又严谨的实现这一需求呢?
严谨指的是限制用户输入的范围,避免用户输入不存在的实现名;
优雅指的是尽量不用 if...else...
, 因为当需求变化,当前接口的实现越来越多,就会形成 if...else...
屎山般的代码,代码逻辑复杂难懂,看着就难受。
解决方法其实非常简单:map+enum
就可以实现 优雅又严谨
可以理解为工厂模式或者策略模式
在springboot 框架的优雅实践。
接口
java 代码解读复制代码package com.example.testspring.user.service;
public interface IUserService {
String say();
}
实现A
java 代码解读复制代码@Service
public class AUserService implements IUserService {
@Override
public String say() {
return "this AA UserService";
}
}
实现B
java 代码解读复制代码@Service
public class BUserService implements IUserService {
@Override
public String say() {
return "this BB UserService";
}
}
实现C
java 代码解读复制代码@Service
public class BUserService implements IUserService {
@Override
public String say() {
return "this CC UserService";
}
}
java 代码解读复制代码@AllArgsConstructor
@Getter
public enum UserTypeEnum {
A_USER(100, AUserService.class.getSimpleName()),
B_USER(200, BUserService.class.getSimpleName()),
C_USER(200, CUserService.class.getSimpleName());
private final Integer code;
private final String serviceName;
}
java 代码解读复制代码
@RestController
@RequestMapping("/api/v1/user/index")
public class IndexController {
@Autowired
private Map<String, IUserService> userServiceMap;
@PostMapping("/hello")
public Map<String, String> test(@RequestBody @Validated UserDTO userDTO) {
try {
String name = userDTO.getUserType().getServiceName();
IUserService userService = userServiceMap.get(name);
String say = userService.say();
return new HashMap<String, String>() {
{
put("username", userDTO.getUsername());
put("phone", userDTO.getPhone().toString());
put("say", say);
}
};
} catch (Exception e) {
System.out.println(e.getMessage());
}
return new HashMap<>();
}
}
特别关注两个地方:
java 代码解读复制代码@Autowired
private Map<String, IUserService> userServiceMap;
java 代码解读复制代码String name = userDTO.getUserType().getServiceName();
IUserService userService = userServiceMap.get(name);
String say = userService.say();
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。