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

相关推荐
九转成圣1 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
直奔標竿1 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵2 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
野生技术架构师3 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
小袁拒绝摆烂4 小时前
多表关联大平层转JSON树形结构
java·json
ja哇5 小时前
大厂面试高频八股
java·面试·职场和发展
yoyo_zzm5 小时前
Laravel6.x新特性全解析
java·spring boot·后端
Nick_zcy5 小时前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi
源码宝5 小时前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理