Java 中介者模式(Mediator Pattern)详解
🧠 什么是中介者模式?
中介者模式是一种行为型设计模式,它通过定义一个中介者对象来封装一组对象之间的交互。中介者使得各个对象不需要显式地知道彼此之间的关系,从而减少了对象之间的耦合。对象与对象之间通过中介者进行通信,避免了直接交互。
中介者模式常用于多个对象之间存在复杂的关系和交互时,能够减少对象之间的依赖关系并提高系统的灵活性。
🎯 使用场景
- 当多个对象之间的交互复杂,直接通信会导致系统的复杂性增加时。
- 需要避免类之间过多的耦合关系。
- 系统中需要有一个集中式的对象来管理和协调各个对象的交互。
🏗️ 模式结构
- Mediator(抽象中介者):定义一个接口,用来与不同的对象进行交互。
- ConcreteMediator(具体中介者):实现中介者接口,协调不同对象之间的交互。
- Colleague(同事类):每个同事类都与中介者对象交互。
- ConcreteColleague(具体同事类):实现与中介者的交互方法,处理具体业务逻辑。
✅ 示例:聊天室中介者
抽象中介者类
java
public interface ChatRoomMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
具体中介者类
java
import java.util.ArrayList;
import java.util.List;
public class ChatRoom implements ChatRoomMediator {
private List<User> users;
public ChatRoom() {
this.users = new ArrayList<>();
}
@Override
public void sendMessage(String message, User user) {
for (User u : users) {
// 排除发送消息的用户
if (u != user) {
u.receive(message);
}
}
}
@Override
public void addUser(User user) {
this.users.add(user);
}
}
同事类(用户)
java
public abstract class User {
protected ChatRoomMediator mediator;
protected String name;
public User(ChatRoomMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void sendMessage(String message);
public abstract void receive(String message);
}
具体同事类(用户实现)
java
public class ConcreteUser extends User {
public ConcreteUser(ChatRoomMediator mediator, String name) {
super(mediator, name);
}
@Override
public void sendMessage(String message) {
System.out.println(this.name + " sending message: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + " received message: " + message);
}
}
客户端
java
public class Client {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoom();
User user1 = new ConcreteUser(chatRoom, "Alice");
User user2 = new ConcreteUser(chatRoom, "Bob");
User user3 = new ConcreteUser(chatRoom, "Charlie");
chatRoom.addUser(user1);
chatRoom.addUser(user2);
chatRoom.addUser(user3);
user1.sendMessage("Hi Bob!");
user2.sendMessage("Hello Alice!");
user3.sendMessage("Hey everyone!");
}
}
✅ 优点
- 减少了类之间的耦合:通过中介者对象来协调交互,避免了对象直接通信。
- 集中式控制:所有的交互通过中介者控制,简化了系统的复杂度。
- 提高灵活性:如果要增加新的交互,只需要修改中介者,不需要改变具体的同事类。
⚠️ 缺点
- 中介者可能成为"上帝对象":中介者对象可能会变得非常庞大,包含大量的逻辑,导致代码不易维护。
- 增加系统的复杂性:对于简单的交互,使用中介者模式可能会引入不必要的复杂性。
🧩 使用建议
中介者模式适用于处理对象之间复杂交互的场景,尤其是当多个对象之间的关系密切并且频繁交互时。通过中介者模式可以有效地减少类之间的直接耦合,增加系统的可维护性和扩展性。
典型应用场景包括:
- GUI系统中组件之间的交互;
- 多对象间的协作和消息传递;
- 复杂的工作流或流程管理。