告别 if-else:多报文处理的优雅方案
做后端开发久了,总会遇到这种场景:网关或消息队列收到不同业务类型的报文,需要路由到不同的 Service 处理。如果报文类型有十几种甚至更多,写一堆 if-else 或者 switch-case 不仅难看,后期维护也是灾难。每次加个新报文,都得改核心逻辑,一不小心还容易漏掉分支。
其实设计模式里早就给出了答案:策略模式(Strategy)配合工厂模式(Factory)。
为什么不用 if-else?
除了代码可读性差,硬编码的分支判断违反了开闭原则(OCP)。一旦新增一种报文类型,你就得修改现有代码,这在并发高、迭代快的生产环境里风险很大。
核心思路
把每种报文的处理逻辑封装成独立的策略类,通过一个工厂根据报文类型返回对应的策略实例。主流程只需要调用策略的 execute 方法,完全不需要知道具体是哪种报文。
代码实现
先定义一个统一的处理接口。
public interface MessageHandler {
void handle(MessageContext context);
String getType();
}
接着实现具体的策略。比如订单报文和支付报文。
@Component
public class OrderMessageHandler implements MessageHandler {
@Override
public void handle(MessageContext context) {
// 处理订单逻辑
System.out.println("Processing order: " + context.getId());
}
@Override
public String getType() {
return "ORDER";
}
}
这里有个关键点,利用 Spring 的 Bean 管理,我们可以自动注册这些 Handler。但为了更灵活地控制映射关系,通常建议用 Map 来存储。
在工厂类中,我们初始化这个映射表。
@Component
public class MessageHandlerFactory {
private final Map<String, MessageHandler> handlerMap = <>();
{
(MessageHandler handler : handlers) {
handlerMap.put(handler.getType(), handler);
}
}
MessageHandler {
handlerMap.get(type);
}
}

