借助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一起,每天不一样!

相关推荐
Pluchon4 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦雨生生5 小时前
java开发工具(学习第一天)
java·开发语言·学习
她说可以呀6 小时前
Spring-ai-alibaba文生图
java·人工智能·spring
松仔log7 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才8 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
snow@li8 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
sugar__salt8 小时前
Spring 三层架构与 IoC、依赖注入完全指南
java·spring boot·后端·spring·架构·maven·intellij-idea
edwarddamon9 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
Raas1009 小时前
MAIGateway,魔芋企业级AI网关的FinAPI成本竞争力设计
java·后端·网关·api网关·魔芋ai·finapi·mai gateway
evans在进步10 小时前
Spring AI 从入门到实战:用 Java 实现大模型对话与 Tool Calling
java·人工智能·spring