中介者模式通过引入中介者对象封装多个对象间的交互,降低耦合度。例如在聊天室系统中,用户通过中介者ChatRoom发送消息,避免直接引用,实现星型通信结构,提升可维护性和扩展性,适用于GUI、多点通信等场景。

在Java中,当多个对象之间频繁交互时,直接引用会导致系统高度耦合,难以维护和扩展。中介者模式(Mediator Pattern)通过引入一个中介者对象来封装一系列对象之间的交互,从而降低它们之间的直接依赖,实现松耦合的多层对象协调。
什么是中介者模式
中介者模式属于行为型设计模式,它用一个中介对象来封装一组对象之间的交互。原本对象之间相互引用、直接通信的方式被改为都通过中介者进行通信,这样对象之间不再需要知道彼此的存在。
核心角色包括:
- Mediator(中介者接口):定义同事对象用来通信的接口。
- ConcreteMediator(具体中介者):实现中介者接口,协调各个同事对象之间的交互逻辑。
- Colleague(同事类):每个同事对象持有中介者的引用,通过中介者与其他同事通信。
实际应用场景示例
假设我们开发一个聊天室系统,用户(User)之间不能直接发送消息,必须通过聊天室(ChatRoom)转发。这时,聊天室就是中介者。
立即学习“Java免费学习笔记(深入)”;
// 中介者接口
interface ChatMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
// 具体中介者:聊天室
class ChatRoom implements ChatMediator {
private List users = new ArrayList<>();
public void addUser(User user) {
users.add(user);
}
public void sendMessage(String message, User sender) {
for (User user : users) {
// 不发送给自己
if (user != sender) {
user.receive(message);
}
}
}
}
// 同事类:用户
class User {
protected String name;
protected ChatMediator mediator;
public User(String name, ChatMediator mediator) {
this.name = name;
this.mediator = mediator;
mediator.addUser(this);
}
public void send(String message) {
System.out.println(name + " 发送: " + message);
mediator.sendMessage(message, this);
}
public void receive(String message) {
System.out.println(name + " 收到: " + message);
}
}
使用方式:
ChatMediator chatRoom = new ChatRoom();
User alice = new User("Alice", chatRoom);
User bob = new User("Bob", chatRoom);
alice.send("你好,Bob!");
// 输出:
// Alice 发送: 你好,Bob!
// Bob 收到: 你好,Bob!
中介者模式的优势与适用场景
该模式显著降低了对象间的耦合度,将复杂的网状关系变为星型结构——所有对象只与中介者通信。
优点包括:
- 减少子对象之间的直接依赖,提升可维护性。
- 将交互逻辑集中管理,便于修改和扩展。
- 符合开闭原则,新增同事类不影响现有逻辑。
典型适用场景有:
- 多个组件需要协同工作的GUI界面。
- 聊天系统、会议系统等多点通信场景。
- 模块间交互复杂但需解耦的业务系统。
注意事项
虽然中介者模式有助于解耦,但也要注意避免将过多逻辑集中在中介者中,导致其变成“上帝对象”。应合理划分职责,必要时结合其他模式(如观察者模式)进一步优化结构。
基本上就这些,中介者模式为多对象协作提供了一种优雅的解耦方案,在适当场景下能显著提升代码的清晰度与可维护性。










