使用Map+函数式接口优化if else
工作中遇到一个接口要返回不同数据表中的数据,首先想到的是使用if-else或者switch case:
例如:
if(("1").equals(dataType)){
return "1";
}else if(("2").equals(dataType)){
return "2";
}else if(("3").equals(dataType)){
return "3";
}else if(("4").equals(dataType)){
return "4";
}
上只是示例:实际比这更多,意味着的写大量的代码,这里只是简单的示例,实际每个if-else 中并不会这又这一行代码
1.使用策略模式
策略模式是把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,仅修改一个具体的实现类的逻辑即可,增加可维护性。
优点:策略模式在业务逻辑分派的时候还是if-else,比上示例的if-else 更好维护一点。
if(("1").equals(dataType)){
return new Context(new dataType1()).ContextInterface();
}else if(("2").equals(dataType)){
return new Context(new dataType2()).ContextInterface();
}else if(("3").equals(dataType)){
return new Context(new dataType3()).ContextInterface();
}else if(("4").equals(dataType)){
return new Context(new dataType4()).ContextInterface();
}
缺点:
如果 if-else的判断情况很多,那么对应的具体策略实现类也会很多,每多一种业务就要多写实现类。
无法看到整个的业务逻辑
2.使用Map+函数式接口优化if else
使用java8的新特性lambda表达式
判断条件发在Map的key上
具体的对应业务逻辑放在Value上
@Service
public class QueryGrantTypeService {
@Autowired
private GrantTypeSerive grantTypeSerive;
private Map<String, Function<String,String>> grantTypeMap = new HashMap<>();
/**
* PostConstruct :该注解的作用
* @PostConstruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
* 从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
* 执行顺序 Constructor >> @Autowired >> @PostConstruct
*
* 初始化业务分派逻辑,代替if-else部分
* key:优惠券类型
* value:lambda表达式,最终会获得该优惠券的派发方式
*/
@PostConstruct
public void dispatcherInit(){
grantTypeMap.put("红包",resourceId -> grantTypeSerive.redPaper(resourceId));
grantTypeMap.put("优惠券",resourceId -> grantTypeSerive.shopping(resourceId));
grantTypeMap.put("QQVIP",resourceId -> grantTypeSerive.QQVIP(resourceId));
}
public String getResult(String resourceType, String resourceId){
//COntroller根据 优惠券类型resoourceType,编码resourceId 去查询 发放方式grantType
Function<String, String> result = grantTypeMap.get(resourceType);
if(result !=null) {
//传入编码resourceId 执行这段表达式获得String 的grantType
return result.apply(resourceId);
}
return "查询不到该优惠券的发放方式";
}
可以把if逻辑代码抽出来,每一个业务对应每一个Service,resourceId为业务Id,可以用来查询数据库
@Component
public class GrantTypeSerive {
public String redPaper(String resourceId){
return "红包的派发 每周六晚上六点 ! ! !";
}
public String shopping(String resourceId){
return "优惠券的派发 每周二晚上六点 ! ! !";
}
public String QQVIP(String resourceId){
return "QQVIP派发 每月一日早上八点 ! ! !";
}
}
接口实现
@RestController
public class WavesController {
@Autowired
private QueryGrantTypeService queryGrantTypeService;
@PostMapping("/getGrantType")
public AjaxResult getResult(){
String res = queryGrantTypeService.getResult("QQVIP","1001");
String res2 = queryGrantTypeService.getResult("优惠券","1002");
Map<String,Object> map = new HashMap<>();
map.put("res",res);
map.put("res2",res2);
return AjaxResult.success(map);
}
返回结果