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

相关推荐
程序员黑豆3 小时前
Java字符串详解
java·前端·ai编程
EntyIU5 小时前
NFS离线部署
java
少晓年7 小时前
Spring Security OAuth2.0 自定义过滤器实践:从原理到实战
spring
OH_TPC7 小时前
HarmonyOS APP开发---“滤镜大师“图像处理App,需要用到这个库
java·图像处理·华为·harmonyos·鸿蒙
imaol19 小时前
链表 -- 环链表
java·前端·链表
imaol19 小时前
链表 -- 双向链表
java·前端·链表
2601_963869959 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
xin_nai10 小时前
LeetCode热题100(Java)(7)链表(下)
java·leetcode·链表
于烛10 小时前
为什么hasNext() 对只有一个元素的集合返回 true?90%初学者都有的疑问
java
wuminyu10 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++