中介者模式和观察者模式的区别是什么
中介者模式和观察者模式都是行为设计模式,用于处理对象间的交互,但它们的设计理念和适用场景有显著区别:
核心思想差异
-
观察者模式:建立一种一对多的依赖关系,当一个对象(被观察者)状态变化时,所有依赖它的对象(观察者)会自动收到通知并更新。
例如:新闻订阅,报社(被观察者)发布新闻后,所有订阅者(观察者)都会收到报纸。 -
中介者模式:通过引入一个中介者对象,将多个对象(同事)之间的交互集中管理,同事对象不再直接通信,而是通过中介者间接交互,实现多对多关系的解耦。
例如:聊天室,用户(同事)之间不直接发消息,而是通过聊天室(中介者)转发。
交互方式差异
特性 | 观察者模式 | 中介者模式 |
---|---|---|
交互方向 | 单向(被观察者 → 观察者) | 双向(通过中介者实现多向交互) |
通信方式 | 被观察者主动通知观察者 | 同事通过中介者间接通信 |
关系维护 | 被观察者维护观察者列表 | 中介者维护所有同事的引用 |
核心目的 | 实现状态变化的自动传播 | 集中管理复杂的多对象交互 |
代码结构差异
-
观察者模式:
包含Subject
(被观察者)和Observer
(观察者)接口,Subject
提供注册/移除观察者的方法,以及通知方法。 -
中介者模式:
包含Mediator
(中介者)和Colleague
(同事)接口,Mediator
定义协调同事交互的方法,同事通过中介者与其他同事通信。
适用场景差异
-
观察者模式适合:
- 一个对象状态变化需要触发多个对象更新(如事件监听机制)
- 观察者数量动态变化(如订阅/取消订阅功能)
典型案例:GUI控件的事件响应、消息通知系统
-
中介者模式适合:
- 多个对象之间存在复杂的交叉引用,导致依赖关系混乱
- 需要集中控制多个对象的交互逻辑(如聊天室、游戏中的角色交互)
典型案例:航空管制系统、聊天室、窗口管理器
总结
- 观察者模式是 广播通知,强调一个源头触发多个响应;
- 中介者模式是 集中调度,强调多对象通过中间层交互。
观察者模式解决的是对象与观察者的联动问题,而中介者模式解决的是多对象间的交互复杂性问题。