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

简介: `shigen`是一位致力于分享成长与认知的博客作者。本文介绍了如何利用Spring的IOC机制替代条件判断,优化代码结构。通过抽象类`QuestionHandler`和具体实现,结合IOC注入,实现了问题类型的动态处理,提高了代码的可扩展性和维护性。与shigen一起,每天都有新收获!

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

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

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

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);
    }
}

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

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

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

  • 具体实现

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

@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注入

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

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

目录
相关文章
|
22天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
33 4
|
6月前
|
缓存 监控 安全
AOP则关注如何将那些影响多个类的功能模块化
AOP则关注如何将那些影响多个类的功能模块化
|
7月前
|
安全 Java 程序员
Spring框架的核心特性是什么?
【4月更文挑战第30天】Spring 的特性
405 0
|
7月前
|
Java 测试技术 开发者
【亮剑】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强
【4月更文挑战第30天】通过自定义注解实现Spring AOP,可以更灵活地控制方法拦截和增强。首先定义自定义注解,如`@MyCustomAnnotation`,然后创建切面类`MyCustomAspect`,使用`@Pointcut`和`@Before/@After`定义切点及通知。配置AOP代理,添加`@EnableAspectJAutoProxy`到配置类。最后,在需拦截的方法上应用自定义注解。遵循保持注解职责单一、选择合适保留策略等最佳实践,提高代码可重用性和可维护性。记得测试AOP逻辑。
217 1
|
7月前
|
Java 开发者 Spring
灵活扩展Spring:后置处理器的实战技巧与最佳实践
灵活扩展Spring:后置处理器的实战技巧与最佳实践
84 0
|
7月前
|
前端开发 Java UED
解密Spring MVC异常处理:从局部到全局,打造稳固系统的关键步骤
解密Spring MVC异常处理:从局部到全局,打造稳固系统的关键步骤
202 0
|
NoSQL Redis
如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
72 0
|
缓存 Java Spring
Spring源码分析之循环依赖及解决方案(一)
Spring源码分析之循环依赖及解决方案
93449 4
Spring源码分析之循环依赖及解决方案(一)
|
XML 缓存 Java
初步走入 Spring 事务底层核心前置源码(下)
初步走入 Spring 事务底层核心前置源码(下)
89 0
|
XML 存储 缓存
初步走入 Spring 事务底层核心前置源码(上)
初步走入 Spring 事务底层核心前置源码
104 0