← 返回题目列表

外观模式和适配器、代理、中介者模式有什么区别?

高频 中等 第 8 / 25 题 更新于 2026/07/28
外观模式适配器模式代理模式中介者模式设计模式对比

简化版

外观模式关注简化复杂子系统调用;适配器模式关注接口转换;代理模式关注控制对象访问;中介者模式关注对象之间复杂交互的集中协调。外观是“子系统太复杂,包一个入口”,适配器是“接口不兼容,转一下”,代理是“访问要控制”,中介者是“对象关系太乱,集中协调”。

详细版

核心区别:

模式目的典型关键词
外观模式简化子系统使用统一入口、粗粒度接口
适配器模式转换不兼容接口接口转换、兼容旧系统
代理模式控制访问或增强访问过程权限、缓存、远程、AOP
中介者模式协调多个对象交互交互集中、网状依赖解耦

外观模式通常面向一组子系统,提供更简单的入口;适配器通常面向接口不匹配的对象;代理通常和真实对象实现相同接口;中介者强调对象之间不直接互相调用。

完整版教学

一、外观模式:子系统复杂,提供统一入口

外观模式解决的是“调用复杂”。

orderFacade.createOrder(request);

内部可能调用用户、商品、库存、优惠券、订单、消息等多个系统。

它的关键词是简化和收口。

二、适配器模式:接口不匹配,需要转换

适配器模式解决的是“接口不兼容”。

例如系统需要:

PayService.pay(orderId, amount);

第三方 SDK 提供:

WxClient.createTransaction(wxRequest);

适配器负责把一种接口转成另一种接口。

三、代理模式:访问真实对象前后做控制

代理模式解决的是“访问控制”。

例如:

  • 权限校验;
  • 缓存;
  • 日志;
  • 事务;
  • 远程代理;
  • 延迟加载。

代理对象通常和真实对象实现相同接口,客户端以为自己在调用真实对象。

四、中介者模式:对象之间交互太复杂

中介者模式解决的是“对象互相依赖太乱”。

比如聊天室:

用户 A 不直接通知用户 B、C、D
而是把消息发给 ChatRoomMediator
Mediator 再分发

它强调对象之间不直接互相调用,而是通过中介者协调。

五、不要只看代码是否包了一层

这些模式都可能出现“包装类”。

判断时要看意图:

  • 为了简化复杂系统:外观;
  • 为了接口兼容:适配器;
  • 为了控制访问:代理;
  • 为了解耦对象交互:中介者。

面试时抓住设计目的,比背类图更有效。

六、常见误区与追问

四种模式都可能出现“包一层”,区别在包这一层的目的。面对3个复杂子系统提供下单入口是外观;把旧支付接口转换成新接口是适配器;在真实服务前做鉴权是代理;集中协调多个同事对象是中介者。代码形状相似时,应从变化来源和参与者关系判断。

检查维度判定依据
外观 / 适配器简化一组接口 / 转换不兼容接口
代理 / 中介者控制访问 / 协调多对象交互

记忆钩子:外观求简单,适配器求兼容,代理求控制,中介者求协调。

  • 误区:只要包装多个对象就是外观。 中介者也协调多个对象,但它处理的是同事对象间网状交互。
  • 追问:外观能同时做适配吗? 可以组合使用,但回答时要分别指出简化与接口转换两种意图。
  • 误区:代理一定保持完全相同实现。 代理通常保持相同抽象以替代真实对象,内部可增加访问逻辑。
  • 追问:如何从依赖方向区分中介者? 同事对象常持有中介者引用并通过它交互,子系统通常不知道 Facade。
  • 追问:面试时最可靠的判断依据是什么? 先说要解决的问题,再说明接口关系和运行期调用方向。

七、加强记忆

外观、适配器、代理、中介者都可能看起来像“多包一层”,但目的不同。外观简化子系统,适配器转换接口,代理控制访问,中介者协调交互。看设计意图,就不会混。