1. 中介者模式:解决模块间复杂调用的利器
在软件开发中,我们经常会遇到多个模块或对象之间需要相互通信的场景。随着系统复杂度增加,这些模块间的直接调用关系会变得像蜘蛛网一样错综复杂。这时候就需要一个"中间人"来协调各方关系——这就是中介者模式的核心价值。
我曾在电商系统开发中遇到过这样的问题:订单模块需要调用库存模块检查库存,支付模块需要通知物流模块发货,促销模块又要根据订单金额计算优惠。最初采用直接调用的方式,结果导致模块间高度耦合,任何一个小改动都可能引发连锁反应。后来引入中介者模式后,系统维护成本降低了60%以上。
中介者模式(Mediator Pattern)属于行为型设计模式,它通过定义一个封装一组对象交互的中介者对象,来解耦这些对象之间的显式相互引用。就像现实生活中的房屋中介,买卖双方不需要直接打交道,所有沟通都通过中介完成。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 中介者模式的核心结构与原理
2.1 模式结构解析
中介者模式包含四个关键角色:
- Mediator(抽象中介者):定义同事对象到中介者对象的接口
- ConcreteMediator(具体中介者):实现抽象中介者的接口,协调各同事对象
- Colleague(抽象同事类):定义同事对象的接口,持有中介者引用
- ConcreteColleague(具体同事类):实现抽象同事类接口
java复制// 抽象中介者
interface Mediator {
void register(Colleague colleague);
void relay(Colleague colleague, String message);
}
// 具体中介者
class ConcreteMediator implements Mediator {
private List<Colleague> colleagues = new ArrayList<>();
public void register(Colleague colleague) {
colleagues.add(colleague);
}
public void relay(Colleague sender, String message) {
for(Colleague c : colleagues) {
if(c != sender) {
c.receive(message);
}
}
}
}
// 抽象同事类
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
abstract void send(String message);
abstract void receive(String message);
}
// 具体同事类
class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
public void send(String message) {
mediator.relay(this, message);
}
public void receive(String message) {
System.out.println("ColleagueA received: " + message);
}
}
2.2 工作原理详解
中介者模式的核心在于将网状结构变为星型结构。在没有中介者的情况下,对象间的关系是这样的:
code复制A ↔ B
A ↔ C
B ↔ C
D ↔ A
D ↔ B
...
引入中介者后,关系变为:
code复制 A
|
M
/ | \
B C D
所有通信都通过中介者M进行转发,各对象只需知道中介者,而不需要知道其他对象的存在。
提示:中介者模式特别适合以下场景:
- 系统中对象之间存在复杂的引用关系
- 多个类相互耦合形成了网状结构
- 希望通过中间层来封装多个类的行为
3. 中介者模式的典型应用场景
3.1 GUI开发中的事件处理
在图形用户界面开发中,各种控件(按钮、文本框、下拉框等)之间经常需要交互。比如选中某个复选框时,需要禁用某些输入框;点击提交按钮时,需要验证多个输入项。
传统做法是让控件直接相互引用和调用,这会导致高度耦合。使用中介者模式,可以让所有交互通过一个对话框中介者来处理:
typescript复制// 对话框中介者
class DialogMediator {
private submitButton: Button;
private nameInput: TextField;
private agreeCheckbox: Checkbox;
constructor(button: Button, input: TextField, checkbox: Checkbox) {
this.submitButton = button;
this.nameInput = input;
this.agreeCheckbox = checkbox;
// 设置回调
this.agreeCheckbox.onChange = (checked) => {
this.submitButton.setEnabled(checked);
};
this.nameInput.onChange = (text) => {
this.submitButton.setEnabled(text.length > 0 && this.agreeCheckbox.isChecked());
};
}
}
3.2 电商系统中的订单处理
电商系统中,下单流程涉及多个模块的协作:
- 订单模块创建订单
- 库存模块扣减库存
- 支付模块处理支付
- 物流模块创建运单
- 促销模块计算优惠
- 会员模块增加积分
如果不使用中介者模式,这些模块会形成复杂的调用网。使用中介者后:
python复制class OrderMe
