还在用策略模式解决 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 去查询 发放方式grantTypeFunction<String,String> result=getGrantTypeMap.get(resourceType);if(result!=null){//传入resourceId 执行这段表达式获得String型的grantTypereturn 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......等技术栈!
⬇戳阅读原文领取! 朕已阅
评论



