新来的_大神_用策略模式把if-else给_优化_了,技术总监说:能不能想好了再改?(1)

最后

由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。

image

本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

直接show代码结构:为了简单演示一个思路,代码用String 类型来模拟一个业务BO

其中:

  1. getCheckResult() 为传统的做法

  2. getCheckResultSuper()则事先在Map中定义好了“判断条件”与“业务逻辑”的映射关系,具体讲解请看代码注释

/**

  • 某个业务服务类
    */
    @Service
    public class BizService {

/**

  • 传统的 if else 解决方法
  • 当每个业务逻辑有 3 4 行时,用传统的策略模式不值得,直接的if else又显得不易读
    */
    public String getCheckResult(String order) {
    if (“校验1”.equals(order)) {
    return “执行业务逻辑1”;
    } else if (“校验2”.equals(order)) {
    return “执行业务逻辑2”;
    }else if (“校验3”.equals(order)) {
    return “执行业务逻辑3”;
    }else if (“校验4”.equals(order)) {
    return “执行业务逻辑4”;
    }else if (“校验5”.equals(order)) {
    return “执行业务逻辑5”;
    }else if (“校验6”.equals(order)) {
    return “执行业务逻辑6”;
    }else if (“校验7”.equals(order)) {
    return “执行业务逻辑7”;
    }else if (“校验8”.equals(order)) {
    return “执行业务逻辑8”;
    }else if (“校验9”.equals(order)) {
    return “执行业务逻辑9”;
    }
    return “不在处理的逻辑中返回业务错误”;
    }

/**

  • 业务逻辑分派Map
  • Function为函数式接口,下面代码中 Function<String, String> 的含义是接收一个Stirng类型的变量,返回一个String类型的结果
    */
    private Map<String, Function<String, String>> checkResultDispatcher = new HashMap<>();

/**

  • 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
    */
    @PostConstruct
    public void checkResultDispatcherInit() {
    checkResultDispatcher.put(“校验1”, order -> String.format(“对%s执行业务逻辑1”, order));
    checkResultDispatcher.put(“校验2”, order -> String.format(“对%s执行业务逻辑2”, order));
    checkResultDispatcher.put(“校验3”, order -> String.format(“对%s执行业务逻辑3”, order));
    checkResultDispatcher.put(“校验4”, order -> String.format(“对%s执行业务逻辑4”, order));
    checkResultDispatcher.put(“校验5”, order -> String.format(“对%s执行业务逻辑5”, order));
    checkResultDispatcher.put(“校验6”, order -> String.format(“对%s执行业务逻辑6”, order));
    checkResultDispatcher.put(“校验7”, order -> String.format(“对%s执行业务逻辑7”, order));
    checkResultDispatcher.put(“校验8”, order -> String.format(“对%s执行业务逻辑8”, order));
    checkResultDispatcher.put(“校验9”, order -> String.format(“对%s执行业务逻辑9”, order));
    }

public String getCheckResultSuper(String order) {
//从逻辑分派Dispatcher中获得业务逻辑代码,result变量是一段lambda表达式
Function<String, String> result = checkResultDispatcher.get(order);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(order);
}
return “不在处理的逻辑中返回业务错误”;
}
}

通过http调用一下看看效果:

/**

  • 模拟一次http调用
    */
    @RestController
    public class BizController {

@Autowired
private BizService bizService;

@PostMapping(“/v1/biz/testSuper”)
public String test2(String order) {
return bizService.getCheckResultSuper(order);
}
}

这是个简单的demo演示,之后会举一些复杂的场景案例。

鲁迅曾说过,“每解决一个问题,就会因出更多的问题”。我们一起来看看这样的实现有什么好处,会带来什么问题。

好处很直观:

  1. 在一段代码里直观的看到"判断条件"与业务逻辑的映射关系
  2. 不需要单独定义接口与实现类,直接使用现有的函数式接口(什么?不知道函数式接口?快去了解),而实现类直接就是业务代码本身。

不好的点:

  1. 需要团队成员对lambda表达式有所了解(什么?Java14都出来了还有没用上Java8新特性的小伙伴?)

接下来我举几个在业务中经常遇到的if else场景,并用Map+函数式接口的方式来解决它

在真实业务场景问题的解决思路

有的小伙伴会说,我的判断条件有多个啊,而且很复杂,你之前举个例子只有单个判断逻辑,而我有多个判断逻辑该怎么办呢?

很好解决:写一个判断逻辑的方法,Map的key由方法计算出

/**

  • 某个业务服务类
    */
    @Service
    public class BizService {

private Map<String, Function<String, String>> checkResultDispatcherMuti = new HashMap<>();

/**

  • 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
    */
    @PostConstruct
    public void checkResultDispatcherMuitInit() {
    checkResultDispatcherMuti.put(“key_订单1”, order -> String.format(“对%s执行业务逻辑1”, order));
    checkResultDispatcherMuti.put(“key_订单1_订单2”, order -> String.format(“对%s执行业务逻辑2”, order));
    checkResultDispatcherMuti.put(“key_订单1_订单2_订单3”, order -> String.format(“对%s执行业务逻辑3”, order));
    }

public String getCheckResultMuti(String order, int level) {
//写一段生成key的逻辑:
String ley = getDispatcherKey(order, level);

Function<String, String> result = checkResultDispatcherMuti.get(ley);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(order);
}
return “不在处理的逻辑中返回业务错误”;
}

/**

  • 判断条件方法
    */
    private String getDispatcherKey(String order, int level) {
    StringBuilder key = new StringBuilder(“key”);
    for (int i = 1; i <= level; i++) {
    key.append(“_” + order + i);
    }
    return key.toString();
    }
    }

用http模拟一下:

/**

  • 模拟一次http调用
    */
    @RestController
    public class BizController {

@Autowired
private BizService bizService;

@PostMapping(“/v1/biz/testMuti”)
public String test1(String order, Integer level) {
return bizService.getCheckResultMuti(order, level);
}
}

只要设计好你的key的生成规则就好。

还有小伙伴会问:我的业务逻辑有很多很多行,在checkResultDispatcherMuitInit()方法的Map中直接写不会很长吗?

直接写当然长了,我们可以抽象出一个service服务专门放业务逻辑,然后在定义中调用它就好了:

提供一个业务逻辑单元:

/**

  • 提供业务逻辑单元
    */
    @Service

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

麻烦帮忙转发一下这篇文章+关注我

就这一次!拼多多内部架构师培训Kafka源码笔记(现已绝版)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

736)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值