3.5 中介者模式
中介者模式(Mediator)用一个中介者对象来封装一组对象之间的交互。原本互相直接引用、彼此调用的对象,现在都只和中介者通信。这把“多对多”的网状耦合,收敛成“多对一”的星形结构。
想象一个聊天室:如果每个用户都直接持有其他所有用户的引用,N 个人就是 N×N 条连接。引入聊天室中介者后,每个用户只认识聊天室。下面的实验让你选发送者发消息,看中介者如何转发给其他所有人。
正在加载交互实验...
把交互逻辑集中起来
java
interface Mediator { void notify(Component sender, String event); }
class Dialog implements Mediator {
public void notify(Component sender, String event) {
if (sender == checkbox && event.equals("toggle")) {
textField.setEnabled(checkbox.isChecked()); // 协调逻辑集中在这里
submit.setEnabled(/* ... */);
}
}
}每个控件不再直接操作其它控件,而是把“我变了”通知中介者,由中介者统一决定谁该启用、谁该禁用、谁该刷新。下面的表单实验:勾选条款才能填昵称,填了昵称才能提交——这些联动全由中介者协调。
正在加载交互实验...
正在加载概念检查...
中介者 vs 外观 vs 观察者
- vs 外观:外观是单向的(客户端 → 子系统),且子系统并不知道外观存在;中介者是双向的,同事对象主动通知它。
- vs 观察者:观察者是一对多的单向广播;中介者协调多方的双向交互,逻辑更集中。
正在加载概念检查...
别让中介者变成“上帝对象”
中介者最大的风险是:所有交互逻辑都往里塞,最后它膨胀成一个无所不知、难以维护的“上帝对象”。当一个中介者开始变得臃肿时,考虑按子领域拆分成多个中介者,或重新审视这些对象是否真的需要如此频繁地互动。
正在加载本节练习...