首页 > 其他分享 >一个接口多个实现类,如何调用哪个实现类的方法

一个接口多个实现类,如何调用哪个实现类的方法

时间:2022-10-11 18:00:56浏览次数:34  
标签:调用 return 实现 接口 topic 处理 MqttSubTopicEnum Param handlerServiceMap

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;
}

标签:调用,return,实现,接口,topic,处理,MqttSubTopicEnum,Param,handlerServiceMap
From: https://www.cnblogs.com/zsw1024520/p/16780064.html

相关文章