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处理问题。
用起来也和之前的调用方式一样,这里的巧妙之处就在于将全部问题类型注入到对应的处理类中。而且面向接口的设计,大大的提升了代码的拓展性。当然,如果问题的处理方式足够的简单,还是先建议之前的方式:
- HashMap
- 枚举类
- switch-case
最后附上代码截图:
与shigen一起,每天不一样!