Java 23 种设计模式:从踩坑到精通 | 番外:外观 vs 中介者 —— DispatcherServlet 为什么是两个模式的合体? 📅 2026/7/13 19:00:00 Java 23 种设计模式从踩坑到精通 | 番外外观 vs 中介者 —— DispatcherServlet 为什么是两个模式的合体摘要外观模式和中介者模式都充当“中间人”角色但外观是单向调用的“统一入口”中介者是双向协调的“通信枢纽”。Spring MVC 的DispatcherServlet是理解这两个模式的绝佳案例——它对外为所有 Controller 提供统一入口外观模式对内协调HandlerMapping、HandlerAdapter、ViewResolver等组件之间的交互中介者模式。本文从DispatcherServlet源码出发结合 UML 对比、代码实现和面试高频题帮你彻底分清这对“结构型 vs 行为型”的中间人组合。️本文阅读地图3 分钟速览为什么DispatcherServlet同时扮演“入口”和“枢纽”外观 vs 中介者一张表看懂单向简化 vs 双向协调UML 对比星型结构 vs 网状扁平化Spring MVC 源码级分析doDispatch()如何体现两种模式面试必问“外观和中介者有什么区别DispatcherServlet 用了哪个”《Java 23 种设计模式从踩坑到精通》开篇系列介绍与目录 当前番外 · 外观 vs 中介者 返回系列总目录文章目录Java 23 种设计模式从踩坑到精通 | 番外外观 vs 中介者 —— DispatcherServlet 为什么是两个模式的合体1. 从一个“请求处理”的流程说起2. UML 对比星型结构 vs 网状扁平化2.1 外观模式 UML星型结构2.2 中介者模式 UML网状扁平化3. 四大核心区别4. DispatcherServlet 源码分析两个模式的完美合体4.1 外观模式体现统一的请求入口4.2 中介者模式体现内部组件的协调中心4.3 一张图看懂合体设计5. 面试必问 追问连环炮 《Java 23 种设计模式从踩坑到精通》快速导航1. 从一个“请求处理”的流程说起在 Spring MVC 中一个 HTTP 请求的处理流程大概是这样的浏览器发送/order/query请求DispatcherServlet接收请求分发给对应的 ControllerController 返回ModelAndView由ViewResolver解析视图最终渲染 HTML 返回给浏览器。在这个过程中DispatcherServlet扮演了两个截然不同的角色对客户端浏览器来说它就是一个统一的“入口”——无论什么请求客户端只与DispatcherServlet交互完全不知道背后有HandlerMapping、HandlerAdapter、ViewResolver等一堆组件。这体现的是外观模式。对内部组件来说它是一个“协调中心”——HandlerMapping找到处理器后不直接调用 Controller而是把结果交给DispatcherServletHandlerAdapter执行完也不直接返回视图而是把ModelAndView交还给DispatcherServlet。所有组件之间的交互都通过DispatcherServlet中转。这体现的是中介者模式。// DispatcherServlet 核心方法简化版protectedvoiddoDispatch(HttpServletRequestrequest,HttpServletResponseresponse){// 1. 外观模式对外统一入口——无论什么请求都走这个方法HttpServletRequestprocessedRequestcheckMultipart(request);// 2. 中介者模式内部组件通过 DispatcherServlet 协调ObjecthandlergetHandler(processedRequest);// HandlerMapping → 中介者HandlerAdapterhagetHandlerAdapter(handler);// 中介者 → HandlerAdapterModelAndViewmvha.handle(processedRequest,response,handler);// HandlerAdapter → 中介者processDispatchResult(processedRequest,response,mappedHandler,mv);// 中介者 → ViewResolver}2. UML 对比星型结构 vs 网状扁平化2.1 外观模式 UML星型结构2.2 中介者模式 UML网状扁平化3. 四大核心区别对比维度外观模式中介者模式意图提供统一的单向调用入口简化客户端使用封装对象之间的双向交互降低耦合通信方向单向外观 → 子系统双向同事 ↔ 中介者 ↔ 同事子系统感知子系统不知道外观的存在同事类知道中介者的存在并通过它通信典型应用SLF4J、JdbcTemplate、微服务网关Spring MVCDispatcherServlet对内、聊天室、消息中间件简单记忆外观是“一键启动按钮”单向中介者是“中央调度台”双向。你按下观影按钮外观替你操作所有设备设备不知道外观的存在你在聊天室发消息中介者把消息转发给所有人每个人都知道中介者的存在。4.DispatcherServlet源码分析两个模式的完美合体4.1 外观模式体现统一的请求入口无论什么请求GET、POST、JSON、文件上传对于客户端来说只有一个入口——DispatcherServlet。// DispatcherServlet 对外统一的入口方法OverrideprotectedvoiddoService(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{// 所有请求都走这个方法客户端无需关心内部细节doDispatch(request,response);}外观特征客户端浏览器只知道DispatcherServlet这一个入口客户端完全不知道HandlerMapping、HandlerAdapter、ViewResolver的存在如果内部组件升级比如换一个ViewResolver实现客户端代码零修改。4.2 中介者模式体现内部组件的协调中心// DispatcherServlet 对内各个组件通过 DispatcherServlet 协调protectedvoiddoDispatch(HttpServletRequestrequest,HttpServletResponseresponse){// 1. HandlerMapping 找到处理器 → 返回给中介者ObjecthandlergetHandler(request);// 2. 中介者根据 handler 类型找到对应的 HandlerAdapterHandlerAdapterhagetHandlerAdapter(handler);// 3. HandlerAdapter 执行处理器 → 返回 ModelAndView 给中介者ModelAndViewmvha.handle(request,response,handler);// 4. 中介者调用 ViewResolver 解析视图processDispatchResult(request,response,mappedHandler,mv);}中介者特征HandlerMapping不直接调用 Controller而是把结果返回给DispatcherServletHandlerAdapter不直接返回视图而是把ModelAndView交还给DispatcherServletViewResolver从DispatcherServlet接收数据而不是从 Controller 直接获取所有组件之间不直接交互全部通过DispatcherServlet中转。4.3 一张图看懂合体设计一句话总结DispatcherServlet对外是外观客户端只看得到它一个入口对内是中介者所有组件通过它协调交互。两者互不冲突各司其职。5. 面试必问 追问连环炮基础必问外观模式和中介者模式有什么区别 外观是单向调用简化入口子系统不知道外观存在中介者是双向协调交互同事类知道中介者并依赖它。Spring MVC 的DispatcherServlet用了什么模式 对外体现外观模式统一入口对内体现中介者模式协调 HandlerMapping、HandlerAdapter、ViewResolver 等组件。SLF4J 用了什么设计模式 外观模式。它提供统一日志接口后端绑定 Logback、Log4j2 等实现。面试官追问“DispatcherServlet为什么需要同时用两种模式” 对外简化客户端调用外观对内解耦组件交互中介者。如果只用外观内部组件之间会产生网状依赖如果只用中介者客户端需要知道内部组件的存在。两者配合才能同时解决“对外简洁”和“对内解耦”两个问题。“你能再举一个同时用到外观和中介者的例子吗” 微服务架构中的API 网关。网关对外是外观——客户端只与网关交互不知道后端服务的细节网关对内是中介者——它协调服务发现、负载均衡、认证鉴权等组件的交互。“消息队列RabbitMQ/Kafka的 Broker 是什么模式” 中介者模式。生产者不直接发给消费者而是通过 Broker 中转Broker 负责路由、广播、持久化。恭喜如果你能立刻说出DispatcherServlet对外是外观、对内是中介者并理解两者的单向/双向区别你已经掌握了“中间人”模式最核心的辨析点。延伸阅读本文是外观模式与中介者模式的深度对比。如果你想先了解每种模式的完整原理、UML、代码实现和面试题可以先阅读正篇——外观模式给复杂系统装一个“一键启动” 和 中介者模式对象关系太乱请一位“中间人”再回来看这篇对比效果更佳。 《Java 23 种设计模式从踩坑到精通》快速导航开篇系列介绍与目录当前番外 · 外观 vs 中介者 —— DispatcherServlet 为什么是两个模式的合体你在这里 延伸阅读外观模式正篇 中介者模式正篇创建型模式汇总结构型模式汇总行为型模式汇总 关注《Java 23 种设计模式从踩坑到精通》用 25 篇文章彻底吃透设计模式。福利预告全系列代码及 UML 源码将在完结时统一打包开放点击「关注」「收藏」第一时间获取。 除了设计模式我也在深挖智能物流实战WMS、托盘调度、机器学习落地。欢迎点击头像看看专栏 《出版社物流WMS智能调度实战》。技术相通思路可鉴。