一个接口多个实现类,如何调用哪个实现类的方法
springboot项目中通过applicationContext.getBeansOfType(class)获取某一接口的所有实现类,并通过枚举完成策略模式,替代if/else,使代码更加优雅易于扩展
@Component
public class MqttSubscribeAdapter implements ApplicationContextAware {
/**
* mqtt订阅消息处理实现类实例
*/
private static Map<MqttSubTopicEnum, MqttSubscribeHandlerService> handlerServiceMap;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, MqttSubscribeHandlerService> map = applicationContext.getBeansOfType(MqttSubscribeHandlerService.class);
handlerServiceMap = new HashMap<>(map.size());
map.forEach((key, value) ->
handlerServiceMap.put(value.obtainSubscribedTopic(), value)
);
}
/***
* @Description 获取处理的service
* @Param actionType
* @Return T
* @Author xzq
* @Date 2020/10/21
*/
public static <T extends MqttSubscribeHandlerService> T obtainProcessService(MqttSubTopicEnum topicEnum) {
return (T)handlerServiceMap.get(topicEnum);
}
}
/***
* @Description 分发处理订阅消息
* @Param topic
* @Param payload
* @Return void
* @Author xzq
* @Date 2020/11/4
*/
public void dispatch(String topic, String payload){
MqttSubTopicEnum mqttSubTopicEnum = topicMatching(topic);
if(mqttSubTopicEnum == null){
log.error("订阅消息分发处理异常,无效的topic:{}", topic);
return;
}
MqttSubscribeHandlerService mqttSubscribeHandlerService = MqttSubscribeAdapter.obtainProcessService(mqttSubTopicEnum);
if(null == mqttSubscribeHandlerService){
log.error("订阅消息分发处理异常,topic无对应的处理逻辑:{}", topic);
return;
}
// 订阅处理
mqttSubscribeHandlerService.subscribeHandler(topic, payload);
}
/***
* @Description 处理增强匹配
* @Param topic
* @Return com.wave.kit.device.mqtt.MqttSubscribeHandlerService
* @Author xzq
* @Date 2020/12/26
*/
private MqttSubTopicEnum topicMatching(String topic){
for (MqttSubTopicEnum typeEnum : MqttSubTopicEnum.values()) {
if (isMatch(topic, typeEnum.getTopic())) {
return typeEnum;
}
}
return null;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?