欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 借助spring的IOC能力消除条件判断

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

2025/4/17 19:56:30 来源:https://blog.csdn.net/weixin_55768452/article/details/142617808  浏览:    关键词:借助spring的IOC能力消除条件判断

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 {@Overridepublic String handle(String detail) {return handleQuestionA(detail);}@Overridepublic String getType() {return "A";}
}@Service
class QuestionHandlerB implements QuestionHandler {@Overridepublic String handle(String detail) {return handleQuestionB(detail);}@Overridepublic 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一起,每天不一样!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词