借助spring的IOC能力消除条件判断

devtools/2024/9/29 9:35:52/

shigen坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen

在前边讲到了如何借助HashMap、枚举类、switch-case消除条件判断,这里讲到我们最常见的用spring的IOC能力来消除代码中的逻辑判断。其实大部分的设计模式用的方法也和接下来的这种类似。

我们先分析下最初的代码:

java">public String handleQuestion(String type, String detail) {if ("A".equals(type)) {return handleQuestionA(detail);} else if ("B".equals(type)) {return handleQuestionB(detail);} else if ("C".equals(type)) {return handleQuestionC(detail);} else {throw new IllegalArgumentException("invalid type: " + type);}
}

其实就是想用给定的问题类型处理对应的问题。抽取出对应的要素,我们生成一个抽象类:

  • 生成抽象类
java">interface QuestionHandler {/** 处理问题 */String handle(String detail);/** 获得问题类型 */String getType();
}

这里抽象出QuestionHandler这个类,对应的两个方法:处理问题和获得问题类型

  • 具体实现

对于各种问题场景,只需要实现QuestionHandler接口即可。

java">@Service
class QuestionHandlerA implements QuestionHandler {@Overridepublic String handle(String detail) {return handleQuestionA(detail);}@Overridepublic String getType() {return "A";}
}@Service
class QuestionHandlerB implements QuestionHandler {@Overridepublic String handle(String detail) {return handleQuestionB(detail);}@Overridepublic String getType() {return "B";}
}
  • 关键的一步- IOC注入

还是先来看看代码的设计:

java">@Resource
private List<QuestionHandler> questionHandlers;public String handleQuestionV5(String type, String detail) {return questionHandlers.stream().filter(handler -> handler.getType().equals(type)).findFirst().map(handler -> handler.handle(detail)).orElseThrow(() -> new IllegalArgumentException("invalid type: " + type));
}

这里注入的是全部的问题处理器,然后下边的方法就是根据问题类型找到对应的handler,然后用handler处理问题。

用起来也和之前的调用方式一样,这里的巧妙之处就在于将全部问题类型注入到对应的处理类中。而且面向接口的设计,大大的提升了代码的拓展性。当然,如果问题的处理方式足够的简单,还是先建议之前的方式:

  1. HashMap
  2. 枚举类
  3. switch-case

最后附上代码截图:

本期代码截图

与shigen一起,每天不一样!


http://www.ppmy.cn/devtools/118626.html

相关文章

ARM base instruction -- ccmp

Conditional Compare (register) sets the value of the condition flags to the result of the comparison of two registers if the condition is TRUE, and an immediate value otherwise. 条件比较&#xff08;寄存器&#xff09;如果条件为真&#xff0c;则将条件标志的值…

time命令:轻松测量Linux命令执行时间!

一、命令简介 用途&#xff1a; 用于测量 Linux 命令执行的时间&#xff0c;包括实际时间、用户 CPU 时间和系统 CPU 时间。刚开始以为是用来“看现在几点钟”的 &#x1f972;。标签&#xff1a; 实用工具&#xff0c;性能分析。 ‍ 二、命令参数 2.1 命令格式 time [选项…

golang 如何生成唯一的 UUID

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

ELK-02-skywalking-v10.0.1安装

文章目录 前言一、下载skywalking二、上传到服务器并解压三、安装jdk21四、修改配置五、启动总结 前言 skywalking-v10.0.1安装。 运用es持久化数据&#xff0c;所以需先完成ELK-01步骤。 一、下载skywalking 下载地址&#xff1a;https://skywalking.apache.org/downloads/ …

ClickHouse | TTL策略

背景描述 近期因CK中query_log表空间占用过大问题&#xff0c;导致磁盘使用率很高&#xff0c;通过查阅资料发现可以通过TTL策略进行清理。同时补充了一些相关的查询SQL&#xff0c;以及注意事项&#xff08;供参考&#xff09;。 TTL策略 alter table system.表名 modify TTL …

数据结构讲解二叉树 【一】

&#x1f381;&#x1f381;创作不易&#xff0c;关注作者不迷路&#x1f380;&#x1f380; C语言二叉树 【一】 前言一、数概念及结构1.数的概念1.2树的相关概念1.3树的表示 二、二叉树的概念及结构2.12.2二叉树的性质2.3二叉树的存储结构 三、二叉树的顺序结构实现3.1二叉树…

AIGC学习笔记—minimind详解+训练+推理

前言 这个开源项目是带我的一个导师&#xff0c;推荐我看的&#xff0c;记录一下整个过程&#xff0c;总结一下收获。这个项目的slogan是“大道至简”&#xff0c;确实很简。作者说是这个项目为了帮助初学者快速入门大语言模型&#xff08;LLM&#xff09;&#xff0c;通过从零…

vscode[c、cmake]:某些引用可能丢失,因为在 查找所有引用 启动时,工作区分析不完整

1. 问题描述 vscode 调试一个c语言工程&#xff0c;利用cmake编译调试&#xff0c;通过cmakelist.txt传递宏标识来条件编译代码。但是&#xff0c;在build之后&#xff0c;传递的宏标识不能让vscode自动转跳相关代码&#xff0c;猜测为代码分析时未包含宏标识。提示&#xff1a…