还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS!
阅读本文大概需要 3.5 分钟。
来自:blog.csdn.net/qq_44384533/article/details/109197926
# 文章目录
需求 策略模式 Map+函数式接口 最后捋一捋本文讲了什么
# 需求
实现方式:
根据优惠券类型resourceType -> 确定查询哪个数据表
根据编码resourceId -> 到对应的数据表里边查询优惠券的派发方式grantType和领取规则
红包 —— 红包发放规则表
购物券 —— 购物券表
QQ会员
外卖会员
switch(resourceType){
case "红包":
查询红包的派发方式
break;
case "购物券":
查询购物券的派发方式
break;
case "QQ会员" :
break;
case "外卖会员" :
break;
......
default : logger.info("查找不到该优惠券类型resourceType以及对应的派发方式");
break;
}
# 策略模式
switch(resourceType){
case "红包":
String grantType=new Context(new RedPaper()).ContextInterface();
break;
case "购物券":
String grantType=new Context(new Shopping()).ContextInterface();
break;
......
default : logger.info("查找不到该优惠券类型resourceType以及对应的派发方式");
break;
如果 if-else的判断情况很多,那么对应的具体策略实现类也会很多,上边的具体的策略实现类还只是2个,查询红包发放方式写在类RedPaper里边,购物券写在另一个类Shopping里边;那资源类型多个QQ会员和外卖会员,不就得再多写两个类?有点麻烦了
没法俯视整个分派的业务逻辑
# Map+函数式接口
判断条件放在key中 对应的业务逻辑放在value中
需求:根据优惠券(资源)类型resourceType和编码resourceId查询派发方式grantType
public class QueryGrantTypeService {
private GrantTypeSerive grantTypeSerive;
private Map<String, Function<String,String>> grantTypeMap=new HashMap<>();
/**
* 初始化业务分派逻辑,代替了if-else部分
* key: 优惠券类型
* value: lambda表达式,最终会获得该优惠券的发放方式
*/
public void dispatcherInit(){
grantTypeMap.put("红包",resourceId->grantTypeSerive.redPaper(resourceId));
grantTypeMap.put("购物券",resourceId->grantTypeSerive.shopping(resourceId));
grantTypeMap.put("qq会员",resourceId->grantTypeSerive.QQVip(resourceId));
}
public String getResult(String resourceType){
//Controller根据 优惠券类型resourceType、编码resourceId 去查询 发放方式grantType
Function<String,String> result=getGrantTypeMap.get(resourceType);
if(result!=null){
//传入resourceId 执行这段表达式获得String型的grantType
return result.apply(resourceId);
}
return "查询不到该优惠券的发放方式";
}
}
//具体的逻辑操作
public class GrantTypeSerive {
public String redPaper(String resourceId){
//红包的发放方式
return "每周末9点发放";
}
public String shopping(String resourceId){
//购物券的发放方式
return "每周三9点发放";
}
public String QQVip(String resourceId){
//qq会员的发放方式
return "每周一0点开始秒杀";
}
}
public class GrantTypeController {
private QueryGrantTypeService queryGrantTypeService;
public String test(String resourceName){
return queryGrantTypeService.getResult(resourceName);
}
}
你的队友得会lambda表达式才行啊,他不会让他自己百度去
# 最后捋一捋本文讲了什么
推荐阅读:
SpringBoot 实现 Office 各种格式在线预览(详细教程,包教包会)
执行count(1)、count(*) 与 count(列名) 到底有什么区别?
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅
评论