原创 首发于卫星
"如果你的代码里 if else
多到能织毛衣,是时候考虑优化了!"
想必大家对if else 的使用都不陌生,原本清晰的逻辑渐渐被层层嵌套的 if else 淹没,最终变成啦一座"判断地狱",代码就像屎山,越堆越多,像定时炸弹一样潜伏着,处处都是未知的 Bug
需求
通过MQ接收不同类型的数据,将不同的数据存储在不同的表中,文件处理有顺序
数据类型和对应的表关系:
- YA_DETAILS.DT (表:ya_details)
- ALARM_DETAILS.DT (表:alarm_details)
- COVER_DETAILS.DT (表:cover_details)
原方式
使用简单的 if else 实现
java
@Component
public class DtFileConsumer {
@RabbitListener(queues = "dt")
public void receiveMessage(String message) {
JSONObject jsonObject = new JSONObject(message);
String fileName = jsonObject.getStr("fileName");
if(fileName.startsWith("YA_DETAILS")){
// 处理 YA_DETAILS
} else if (fileName.startsWith("ALARM_DETAILS")){
// 处理 ALARM_DETAILS
} else if (fileName.startsWith("COVER_DETAILS")){
// 处理 COVER_DETAILS 文件
}
}
}
现方式
java
@Component
@RequiredArgsConstructor
public class DtFileConsumer {
private final BaseConditionalDispatcher baseDispatcher;
@RabbitListener(queues = "dt")
public void receiveMessage(String message) {
JSONObject jsonObject = new JSONObject(message);
String fileName = jsonObject.getStr("fileName");
baseDispatcher.dispatch(fileName);
}
}
定义分发器
java
/**
* @description: 通用条件类型分发器,通常用于优化条件选择分支的分发
* @author: Walker
* @date: 2025-04-11 14:45:34
* @version: 1.0.0
* @see top.walker.core.handler.BaseConditionalHandler
*/
@Component
public class BaseConditionalDispatcher {
private static final Logger logger = LoggerFactory.getLogger(BaseConditionalDispatcher.class);
private final List<BaseConditionalHandler<?>> handlers;
public BaseConditionalDispatcher(List<BaseConditionalHandler<?>> handlers) {
// 优先级排序
this.handlers = handlers.stream()
.sorted(Comparator.comparingInt(BaseConditionalHandler::getOrder))
.collect(Collectors.toList());
}
/**
* 分发处理请求
*
* @param processed 待处理的
*/
public void dispatch(Object processed) {
BaseConditionalHandler<?> handler = handlers.stream().filter(h -> h.supports(processed)).findFirst()
.orElseGet(() -> {
logger.info("已跳过:{}", processed);
return null;
});
if (handler != null) {
this.invokeHandler(handler, processed);
}
}
@SuppressWarnings("unchecked")
private <T> void invokeHandler(BaseConditionalHandler<T> handler, Object processed) {
handler.handle((T) processed);
}
}
定义处理器
java
/**
* @description: 通用类型处理器接口
* @author: Walker
* @date: 2025-04-11 14:31:37
* @version: 1.0.0
*/
public interface BaseConditionalHandler<T> {
/**
* 是否支持该数据(支持对象、字符串、数字等多种形式)
*
* @param object 数据
* @return 是否支持
*/
boolean supports(Object object);
/**
* 处理数据的具体实现
*
* @param processed 待处理的内容
*/
void handle(T processed);
/**
* 处理优先级(数值越小优先级越高)
*
* @return 优先级
*/
default int getOrder() {
return 0;
}
}
匹配和处理逻辑
需要进行文件处理的 Service 都需要实现 BaseConditionalHandler 接口
YA_DETAILS 处理
java
@Component
public class YaDetailsServiceImpl implements BaseConditionalHandler<String> {
private static final List<String> SUPPORTED_EXTENSIONS = List.of("YA_DETAILS");
@Override
public boolean supports(Object object) {
return SUPPORTED_EXTENSIONS.stream().anyMatch(s -> ((String) object).startsWith(s));
}
@Override
public void handle(String processed) {
System.out.println("fileName= " + processed);
}
}
ALARM_DETAILS 处理
java
@Component
public class AlarmDetailsServiceImpl implements BaseConditionalHandler<String> {
private static final List<String> SUPPORTED_EXTENSIONS = List.of("ALARM_DETAILS");
@Override
public boolean supports(Object object) {
return SUPPORTED_EXTENSIONS.stream().anyMatch(s -> ((String) object).startsWith(s));
}
@Override
public void handle(String processed) {
System.out.println("fileName= " + processed);
}
}
到此实现了我们需求,后续扩展只需要继承 BaseConditionalHandler 即可
结束!