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