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

目录
相关文章
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
60 1
|
6月前
|
安全 Java 程序员
Spring框架的核心特性是什么?
【4月更文挑战第30天】Spring 的特性
362 0
|
3月前
|
Java Spring 容器
建模底层逻辑问题之以Spring IOC容器为例,使用因果法建模,如何操作
建模底层逻辑问题之以Spring IOC容器为例,使用因果法建模,如何操作
|
4月前
|
Java Spring
Spring初始化加速的思路和方案问题之DAG分析在Spring并行初始化中面临哪些困难
Spring初始化加速的思路和方案问题之DAG分析在Spring并行初始化中面临哪些困难
|
5月前
|
Java Spring
JAVA注解:传统与现代的完美结合,你的代码值得拥有!
【6月更文挑战第29天】Java注解,作为连接传统与现代的编程工具,简化企业级应用开发,提升代码可读性和维护性。通过自定义注解如`@Loggable`,可以将行为(如日志记录)与方法实现分离,减少模板代码。使用AOP(如Spring)处理注解,实现行为拦截,增强代码灵活性和可扩展性。拥抱Java注解,让代码更现代、更高效!
61 16
|
6月前
|
SQL XML Java
MyBatis初探:揭示初始化阶段的核心流程与内部机制
MyBatis初探:揭示初始化阶段的核心流程与内部机制
57 2
MyBatis初探:揭示初始化阶段的核心流程与内部机制
|
6月前
|
SQL Java 数据库连接
深度解析MyBatis核心:探寻其核心对象的精妙设计
深度解析MyBatis核心:探寻其核心对象的精妙设计
103 1
深度解析MyBatis核心:探寻其核心对象的精妙设计
|
6月前
|
Java API Spring
|
6月前
|
Java 开发者 Spring
灵活扩展Spring:后置处理器的实战技巧与最佳实践
灵活扩展Spring:后置处理器的实战技巧与最佳实践
76 0
|
NoSQL Redis
如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
65 0
下一篇
无影云桌面