1. 中介者模式的核心思想与应用场景
中介者模式(Mediator Pattern)是行为型设计模式中的一种,它通过引入一个中介对象来封装一组对象之间的交互关系。想象一下机场的塔台控制系统——如果没有塔台调度员,每架飞机都需要直接与其他所有飞机通信来确定航线,这将导致通信链路呈指数级增长,系统复杂度急剧上升。中介者模式正是为了解决这类"多对多"交互场景而诞生的。
在Java开发中,当遇到以下情况时,中介者模式往往能发挥奇效:
- 聊天室系统(用户之间需要相互通信但不应直接耦合)
- MVC架构中的Controller层(协调View和Model的交互)
- 分布式系统的消息中间件(解耦消息生产者和消费者)
- GUI组件的事件处理(按钮、输入框等组件的联动)
我曾在电商平台的订单系统中应用过中介者模式。最初的设计中,订单服务、库存服务、支付服务和物流服务直接相互调用,形成了复杂的网状依赖。当需要新增一个优惠券服务时,不得不修改四个现有服务的代码。引入订单中介者后,所有服务只与中介者交互,新增功能只需扩展中介者逻辑,各服务保持稳定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 中介者模式的UML结构与Java实现
2.1 标准UML类图解析
中介者模式包含四个核心角色:
code复制┌─────────────┐ ┌─────────────┐
│ Mediator │<>---->│ Colleague │
└─────────────┘ └─────────────┘
^ ^
| |
┌─────────────┐ ┌─────────────┐
│ConcreteMediator│ │ConcreteColleague│
└─────────────┘ └─────────────┘
具体到Java代码实现,我们以聊天室为例:
java复制// 抽象中介者
public interface ChatMediator {
void sendMessage(String msg, User user);
void addUser(User user);
}
// 具体中介者
public class ChatMediatorImpl implements ChatMediator {
private List<User> users;
public ChatMediatorImpl() {
this.users = new ArrayList<>();
}
@Override
public void sendMessage(String msg, User user) {
for(User u : users) {
// 不发送给消息发起者
if(u != user) {
u.receive(msg);
}
}
}
@Override
public void addUser(User user) {
users.add(user);
}
}
// 抽象同事类
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator med, String name) {
this.mediator = med;
this.name = name;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
// 具体同事类
public class UserImpl extends User {
public UserImpl(ChatMediator med, String name) {
super(med, name);
}
@Override
public void send(String msg) {
System.out.println(name + " 发送消息: " + msg);
mediator.sendMessage(msg, this);
}
@Override
public void receive(String msg) {
System.out.println(name + " 收到消息: " + msg);
}
}
2.2 模式的关键实现技巧
- 中介者持有同事引用:在
ChatMediatorImpl中维护了List<User>,这是星型结构的核心 - 同事类仅依赖中介者接口:
User类只知道`ChatMediato
