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

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 {

    @Override
    public String handle(String detail) {
        return handleQuestionA(detail);
    }

    @Override
    public String getType() {
        return "A";
    }
}

@Service
class QuestionHandlerB implements QuestionHandler {
    @Override
    public String handle(String detail) {
        return handleQuestionB(detail);
    }

    @Override
    public 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一起,每天不一样!

相关推荐
工程师老罗20 分钟前
Image(图像)的用法
java·前端·javascript
leo_messi9424 分钟前
2026版商城项目(一)
java·elasticsearch·k8s·springcloud
美味蛋炒饭.38 分钟前
Tomcat 超详细入门教程(安装 + 目录 + 配置 + 部署 + 排错)
java·tomcat
dreamxian1 小时前
苍穹外卖day11
java·spring boot·后端·spring·mybatis
Veggie261 小时前
【Java深度学习】PyTorch On Java 系列课程 第八章 17 :模型评估【AI Infra 3.0】[PyTorch Java 硕士研一课程]
java·人工智能·深度学习
weisian1511 小时前
Java并发编程--19-ThreadPoolExecutor七参数详解:拒绝Executors,手动掌控线程池
java·线程池·threadpool·七大参数
csdn5659738501 小时前
Java打包时,本地仓库有jar 包,Maven打包却还去远程拉取
java·maven·jar
Demon_Hao2 小时前
JAVA通过Redis实现Key分区分片聚合点赞、收藏等计数同步数据库,并且通过布隆过滤器防重复点赞
java·数据库·redis
华科易迅2 小时前
Spring装配对象方法-注解
java·后端·spring
庄周的大鱼3 小时前
分析@TransactionalEventListener注解失效
java·spring·springboot·事务监听器·spring 事件机制·事务注解失效解决