package com.szwl.manager; import com.szwl.handle.*; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; /** * 策略管理器 */ @Component public class MqttHandlerManager { private final Map handlerMap = new HashMap<>(); public MqttHandlerManager(List handlers) { // 手动映射主题到处理器 handlerMap.put("connected", findHandler(handlers, ConnectedMessageHandler.class)); handlerMap.put("disconnected", findHandler(handlers, DisconnectedMessageHandler.class)); handlerMap.put("heart", findHandler(handlers, HeartMessageHandler.class)); handlerMap.put("response", findHandler(handlers, ResponseMessageHandler.class)); } public void dispatch(String topic, String payload) { Optional> handlerEntry = handlerMap.entrySet().stream() .filter(entry -> topic.matches(entry.getKey())) // 通过正则匹配主题 .findFirst(); if (handlerEntry.isPresent()) { handlerEntry.get().getValue().handle(topic, payload); } else { System.out.printf("No handler found for topic [%s]%n", topic); } } private MqttMessageHandler findHandler(List handlers, Class clazz) { return handlers.stream() .filter(handler -> clazz.isAssignableFrom(handler.getClass())) .findFirst() .orElseThrow(() -> new IllegalArgumentException("No handler found for: " + clazz.getName())); } }