目录
1、核心思想
目的:通过引入一个中介对象来封装一组对象之间的交互,解决对象间过度耦合、频繁交互的问题。不管是对象引用维护还是消息的转发,都由处于中心节点的中介全权负责,最终架构出一套类似于星形拓扑的网络结构。
举例:
1> 微服务架构中的注册发现中心
2> 数据库中的外键关系表
3> 网络设备中的路由器
4> Spring框架的DispatcherServlet:作为HTTP请求的中介者,协调Controller、Service和View的交互
2、实现方式
2.1 模式结构
四个核心角色:
- Mediator(中介):共事者之间通信的中介平台接口,定义与共事者的通信标准,如连接注册方法与发送消息方法等。
- ConcreteMediator(中介实现):可以有多种实现,持有所有共事者对象的列表,并实现中介定义的通信方法。
- Colleague(共事者/同事):定义所有同事对象的公共接口,包含对中介者的引用。
- ConcreteColleague(共事实现/同事实现):实现同事类接口,负责具体业务逻辑,并在需要时调用中介者的方法。
2.2 实现案例
聊天室系统:
//1、中介者接口:定义消息发送方法
interface ChatMediator {
void sendMessage(String message, User sender);
void addUser(User user);
}
//2、具体中介者:聊天室
class ChatRoom implements ChatMediator {
private List<User> users = new ArrayList<>();
@Override
public void sendMessage(String message, User sender) {
users.stream().filter(
user -> !user.equals(sender)
).forEach(
user -> user.receive(message);
);
}
@Override
public void addUser(User user) {
users.add(user);
}
}
//3、同事类抽象
abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String message);
public abstract void receive(String message);
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
User user = (User)o;
return Objects.equals(name, user.name);
}
}
//4、具体同事类:聊天用户
class ChatUser extends User {
public ChatUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(name + " 发送消息: " + message);
mediator.sendMessage(message, this); // 通过中介者转发消息
}
@Override
public void receive(String message) {
System.out.println(name + " 收到消息: " + message);
}
}
//5、客户端
public class Client {
public static void main(String[] args) {
ChatMediator chatRoom = new ChatRoom();
User alice = new ChatUser(chatRoom, "Alice");
User bob = new ChatUser(chatRoom, "Bob");
User charlie = new ChatUser(chatRoom, "Charlie");
chatRoom.addUser(alice);
chatRoom.addUser(bob);
chatRoom.addUser(charlie);
alice.send("大家好!"); // 输出:Alice 发送消息 → Bob和Charlie接收
bob.send("你好,Alice!"); // 输出:Bob 发送消息 → Alice和Charlie接收
}
}
3、优缺点分析
优点:
降低耦合度:对象间不直接依赖,通过中介者通信。
集中控制逻辑:交互逻辑集中在中介者,便于维护和扩展。
简化对象职责:同事类只需关注自身行为,无需管理复杂交互。
灵活扩展:新增同事类时,只需修改中介者,无需改动其他类。
缺点:
中介者复杂度高:中介者可能承担过多职责,成为“上帝对象”。
性能开销:中介者处理大量交互时可能成为性能瓶颈。
设计难度:需合理划分中介者与同事类的职责,避免过度设计。
4、适用场景
对象间交互复杂
如GUI组件(按钮、输入框)联动,需统一协调。
系统需解耦
如微服务架构中,通过API网关协调服务间调用。
多对多通信场景
如聊天系统、多玩家游戏中的角色互动。
需要集中管控的场景
如空中交通管制系统、智能家居设备控制。
5、注意事项
避免中介者臃肿
若中介者逻辑过于复杂,可拆分多个子中介者或使用分层设计。
合理设计通信协议
定义清晰的中介者接口,明确消息传递格式和规则。
性能优化
对高频交互场景,采用异步处理或缓存机制提升效率。