定义
中介者模式通过引入中介对象封装多个对象间的交互,使对象间无需直接引用,从而降低耦合度。各对象仅与中介者通信,交互逻辑集中管理,符合迪米特法则(最少知识原则)。
结构
适用场景
1)复杂网状依赖
对象间存在大量直接引用,导致系统混乱(如用户-角色-权限循环依赖)。
2)需集中管控的交互
GUI组件联动(按钮点击触发输入框禁用)。
3)聊天系统中用户消息广播。
多玩家游戏的角色协作(如战斗指令分发)。
4)重构强耦合代码
拆分因直接通信导致难以扩展的类。
使用示例
聊天室系统。
/**
* 抽象中介者
*/
public interface ChatMediator {
void sendMessage(String msg, User sender);
void addUser(User user);
}
/**
* 具体中介者(聊天室)
*/
public class ChatRoom implements ChatMediator {
private List<User> users = new ArrayList<>();
public void addUser(User user) {
users.add(user);
}
public void sendMessage(String msg, User sender) {
for (User user : users) {
if (user != sender) user.receive(msg); // 屏蔽发送者自身
}
}
}
/**
* 抽象同事类
*/
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(String name, ChatMediator mediator) {
this.name = name;
this.mediator = mediator;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
/**
* 具体同事类
*/
public class ChatUser extends User {
public ChatUser(String name, ChatMediator mediator) {
super(name, mediator);
}
public void send(String msg) {
System.out.println(name + " 发送: " + msg);
mediator.sendMessage(msg, this); // 通过中介者转发
}
public void receive(String msg) {
System.out.println(name + " 收到: " + msg);
}
}
public class Client {
public static void main(String[] args) {
ChatMediator chatRoom = new ChatRoom();
User alice = new ChatUser("Alice", chatRoom);
User bob = new ChatUser("Bob", chatRoom);
chatRoom.addUser(alice);
chatRoom.addUser(bob);
alice.send("你好,Bob!");
bob.send("你好,alice!");
}
}