1. 中介者模式的核心价值与适用场景
中介者模式(Mediator Pattern)是一种行为设计模式,它通过引入一个中介对象来封装一组对象之间的交互关系。这种模式的核心价值在于解耦对象间的直接依赖,使原本复杂的网状交互变为星型结构。想象一下机场塔台与飞机的关系——如果没有塔台调度,所有飞行员都需要直接与其他飞机通信,这将导致混乱和危险。中介者模式正是为解决类似场景而生的。
在实际开发中,中介者模式特别适合以下三种典型场景:
-
UI组件交互:比如一个复杂的表单包含多个输入框、复选框和按钮,它们之间存在复杂的联动关系。选中某个复选框可能需要显示/隐藏其他字段,提交按钮需要验证所有输入。如果让这些控件直接相互引用,代码会变得难以维护。
-
聊天室系统:在典型的聊天应用中,如果让每个用户直接与其他所有用户建立连接,系统复杂度会呈指数级增长。引入聊天室服务器作为中介者后,用户只需与服务器通信,由服务器负责消息转发。
-
分布式系统协调:微服务架构中,服务之间如果直接调用会形成复杂的调用链。通过API网关或消息队列作为中介者,可以简化服务间的通信路径,提高系统的可维护性。
提示:判断是否使用中介者模式的一个简单标准是——当你在绘制类关系图时发现对象间连线过多,形成"蜘蛛网"结构时,就该考虑引入中介者了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 中介者模式的结构解析与角色职责
中介者模式包含四个核心角色,每个角色都有明确的职责边界:
2.1 组件(Component)
组件是被协调的对象,它们包含具体的业务逻辑。在模式实现中,组件需要持有对中介者的引用,但不应知道其他组件的存在。典型的组件实现如下:
java复制public abstract class Component {
protected Mediator mediator;
public Component(Mediator mediator) {
this.mediator = mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
}
2.2 中介者接口(Mediator)
定义组件与中介者之间的通信契约,通常只包含一个通知方法。这个接口是解耦的关键,它允许组件与不同的中介者实现协作:
java复制public interface Mediator {
void notify(Component sender, String event);
}
2.3 具体中介者(ConcreteMediator)
封装了组件间的交互逻辑,知道所有需要协调的组件及其关系。它是模式中最复杂的部分,包含了实际的业务规则:
java复制public class AuthenticationDialog implements Mediator {
private Checkbox loginOrRegisterChkBx;
private Textbox loginUsername, loginPassword;
private Button okBtn;
// 构造函数中初始化所有组件并设置中介者引用
public AuthenticationDialog() {
this.loginOrRegisterChkBx = new Checkbox(this);
// 初始化其他组件...
}
@Override
public void notify(Component sender, String event) {
if (sender == loginOrRegisterChkBx && "check".equals(event)) {
if (loginOrRegisterChkBx.isChecked()) {
// 处理登录复选框被选中的逻辑
} else {
// 处理注册复选框被选中的逻辑
}
}
// 处理其他组件事件...
}
}
2.4 具体组件(ConcreteComponent)
实现特定功能的类,当内部状态变化时通知中介者,而不是直接调用其他组件:
java复制public class Checkbox extends Component {
private boolean checked;
public Checkbox(Mediator mediator) {
super(mediator);
}
public void check() {
this.checked = !this.checked;
mediator.notify(this, "check");
}
public boolean isChecked() {
return checked;
}
}
这种结构的关键优势在于:当需要修改组件间的交互逻辑时,只需调整具体中介者的实现,而不用修改各个组件类。这符合开闭原则——对扩展开放,对修改关闭。
3. 中介者模式的实战实现:登录表单案例
让我们通过一个完整的登录/注册表单案例,展示如何实际应用中介者模式。这个表单包含以下元素:
- 登录/注册切换复选框
- 用户名输入框(登录和注册各一个)
- 密码输入框(登录和注册各一个)
- 注册邮箱输入框
- 确定和取消按钮
3.1 组件类的实现
首先实现基础的UI组件类,它们都继承自抽象Component类:
java复制public class Textbox extends Component {
private String content = "";
public Textbox(Mediator mediator) {
super(mediator);
}
public void input(String text) {
this.content = text;
mediator.notify(this, "input");
}
public String getContent() {
return content;
}
}
public class Button extends Component {
public Button(Mediator mediator) {
super(mediator);
}
public void click() {
mediator.notify(this, "click");
}
}
3.2 具体中介者的完整逻辑
AuthenticationDialog类作为中介者,需要管理所有组件并实现业务规则:
java复制public class AuthenticationDialog implements Mediator {
private String title = "登录";
private Checkbox loginOrRegisterChkBx;
private Textbox loginUsername, loginPassword;
private Textbox regUsername, regPassword, regEmail;
private Button okBtn, cancelBtn;
public AuthenticationDialog() {
// 初始化所有组件
this.loginOrRegisterChkBx = new Checkbox(this)
