中介者模式 (Mediator Pattern)
什么是中介者模式?
中介者模式是一种行为型设计模式,它允许你减少对象之间的混乱依赖关系,通过一个中介者对象来协调多个对象之间的交互。
简单来说:中介者模式就是"中间人",让对象通过中间人来通信,而不是直接通信。
生活中的例子
想象一下:
- 聊天室:用户通过聊天室发送消息,而不是直接发送
- 机场塔台:飞机通过塔台协调,而不是直接通信
- 房产中介:买卖双方通过中介交易
为什么需要中介者模式?
传统方式的问题
java
// 对象之间直接通信
object1.send(object2);
object2.send(object3);
object3.send(object1);
问题:
- 耦合度高:对象之间耦合度高
- 难以维护:修改一个对象会影响其他对象
- 难以扩展:新增对象需要修改多个对象
中介者模式的优势
java
// 对象通过中介者通信
mediator.send(object1, object2);
mediator.send(object2, object3);
优势:
- 解耦合:降低对象之间的耦合度
- 集中管理:集中管理对象之间的交互
- 易于扩展:新增对象很容易
中介者模式的结构
┌─────────────────────┐
│ Mediator │ 中介者接口
├─────────────────────┤
│ + send(): void │
└──────────┬──────────┘
│ 实现
│
┌──────────┴──────────┐
│ ConcreteMediator │ 具体中介者
├─────────────────────┤
│ - colleagues: List │
│ + send(): void │
│ + add(): void │
└─────────────────────┘
┌─────────────────────┐
│ Colleague │ 同事接口
├─────────────────────┤
│ - mediator: Med │
│ + send(): void │
│ + receive(): void │
└──────────┬──────────┘
│ 继承
├──┬──────────────────┬──────────────┐
│ │ │
┌──────────┴──────┐ ┌───────────┴───────┐ ┌───┴────────┐
│ ConcreteCol1 │ │ ConcreteCol2 │ │ ... │ 具体同事
├─────────────────┤ ├───────────────────┤ ├────────────┤
│ + receive() │ │ + receive() │ │ │
└─────────────────┘ └───────────────────┘ └────────────┘
代码示例
1. 定义中介者接口
java
/**
* 中介者接口
*/
public interface Mediator {
/**
* 发送消息
* @param message 消息
* @param colleague 发送消息的同事
*/
void send(String message, Colleague colleague);
}
2. 定义同事接口
java
/**
* 同事接口
*/
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
/**
* 发送消息
*/
public abstract void send(String message);
/**
* 接收消息
*/
public abstract void receive(String message);
}
3. 定义具体中介者
java
/**
* 具体中介者:聊天室
*/
public class ChatRoom implements Mediator {
private List<Colleague> colleagues = new ArrayList<>();
/**
* 添加同事
*/
public void addColleague(Colleague colleague) {
colleagues.add(colleague);
}
@Override
public void send(String message, Colleague colleague) {
for (Colleague c : colleagues) {
if (c != colleague) {
c.receive(message);
}
}
}
}
4. 定义具体同事
java
/**
* 具体同事:用户
*/
public class User extends Colleague {
private String name;
public User(Mediator mediator, String name) {
super(mediator);
this.name = name;
}
@Override
public void send(String message) {
System.out.println(name + "发送: " + message);
mediator.send(message, this);
}
@Override
public void receive(String message) {
System.out.println(name + "收到: " + message);
}
}
5. 使用中介者
java
/**
* 中介者模式测试类
* 演示如何使用中介者模式实现聊天室功能
*/
public class MediatorTest {
public static void main(String[] args) {
System.out.println("=== 中介者模式测试 ===\n");
// 创建中介者
ChatRoom chatRoom = new ChatRoom();
// 创建同事
Colleague user1 = new User(chatRoom, "张三");
Colleague user2 = new User(chatRoom, "李四");
Colleague user3 = new User(chatRoom, "王五");
// 添加同事到中介者
chatRoom.addColleague(user1);
chatRoom.addColleague(user2);
chatRoom.addColleague(user3);
// 测试消息发送
System.out.println("--- 张三发送消息 ---");
user1.send("大家好!");
System.out.println("\n--- 李四发送消息 ---");
user2.send("你好!");
System.out.println("\n--- 王五发送消息 ---");
user3.send("很高兴认识大家!");
System.out.println("\n=== 中介者模式的优势 ===");
System.out.println("1. 解耦合:降低对象之间的耦合度");
System.out.println("2. 集中管理:集中管理对象之间的交互");
System.out.println("3. 易于扩展:新增对象很容易");
System.out.println("4. 简化交互:简化对象之间的交互");
System.out.println("\n=== 实际应用场景 ===");
System.out.println("1. 聊天室:用户通过聊天室通信");
System.out.println("2. GUI框架:组件之间通过中介者通信");
System.out.println("3. MVC模式:控制器作为中介者");
System.out.println("4. 航空管制:飞机通过塔台协调");
}
}
中介者模式的优点
- 解耦合:降低对象之间的耦合度
- 集中管理:集中管理对象之间的交互
- 易于扩展:新增对象很容易
- 简化交互:简化对象之间的交互
中介者模式的缺点
- 中介者复杂:中介者可能变得复杂
- 性能问题:所有交互都通过中介者
适用场景
- 多个对象:有多个对象需要交互
- 耦合度高:对象之间耦合度高
- 集中管理:需要集中管理交互
常见应用场景
- 聊天室:用户通过聊天室通信
- GUI框架:组件之间通过中介者通信
- MVC模式:控制器作为中介者
使用建议
- 多个对象:使用中介者模式
- 耦合度高:使用中介者模式
- 简单交互:直接通信即可
注意事项
⚠️ 中介者模式虽然有用,但要注意:
- 不要让中介者过于复杂
- 考虑使用事件总线