Java中介者模式
中介者模式集中管理一组对象之间的交互,降低对象间耦合。
模式定义
意图:用一个中介对象封装一系列对象交互,使对象不需要显式相互引用。
适用场景
- 多对象复杂交互
- 需降低对象间耦合
- 对象交互逻辑集中管理
模式结构
抽象中介者
Java
public interface Mediator {
void register(Colleague colleague);
void relay(Colleague sender, String message);
}
抽象同事
Java
public abstract class Colleague {
protected Mediator mediator;
protected String name;
public Colleague(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
mediator.register(this);
}
public abstract void send(String message);
public abstract void receive(String message, String sender);
}
具体中介者
Java
public class ChatRoom implements Mediator {
private Map<String, Colleague> colleagues = new HashMap<>();
@Override
public void register(Colleague colleague) {
colleagues.put(colleague.name, colleague);
}
@Override
public void relay(Colleague sender, String message) {
for (Colleague colleague : colleagues.values()) {
if (!colleague.name.equals(sender.name)) {
colleague.receive(message, sender.name);
}
}
}
}
具体同事
Java
public class User extends Colleague {
public User(Mediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(name + "发送: " + message);
mediator.relay(this, message);
}
@Override
public void receive(String message, String sender) {
System.out.println(name + "收到来自" + sender + ": " + message);
}
}
使用示例
Java
Mediator chatRoom = new ChatRoom();
User user1 = new User(chatRoom, "张三");
User user2 = new User(chatRoom, "李四");
User user3 = new User(chatRoom, "王五");
user1.send("大家好!");
// 张三发送: 大家好!
// 李四收到来自张三: 大家好!
// 王五收到来自张三: 大家好!
user2.send("你好张三!");
实际应用示例
MVC架构
Controller作为Mediator,协调View和Model:
Java
View ←──→ Controller ←──→ Model
(Mediator)
View和Model不直接交互,通过Controller协调。
事件总线
Java
public class EventBus implements Mediator {
private Map<String, List<Subscriber>> subscribers = new HashMap<>();
public void subscribe(String eventType, Subscriber subscriber) {
subscribers.computeIfAbsent(eventType, k -> new ArrayList())
.add(subscriber);
}
public void publish(String eventType, Object data) {
List<Subscriber> list = subscribers.get(eventType);
if (list != null) {
for (Subscriber subscriber : list) {
subscriber.onEvent(data);
}
}
}
}
GUI组件交互
text
public class DialogMediator implements Mediator {
private Button okButton;
private Button cancelButton;
private TextBox textBox;
private ListBox listBox;
@Override
public void componentChanged(Component component) {
if (component == listBox) {
textBox.setText(listBox.getSelection());
} else if (component == okButton) {
// 处理确认逻辑
textBox.validate();
} else if (component == cancelButton) {
// 处理取消逻辑
textBox.clear();
}
}
}
中介者模式优点
- 降低对象间耦合
- 集中交互逻辑
- 易于扩展新同事对象
- 简化对象通信
中介者模式缺点
- 中介者可能变得复杂
- 中介者承担过多职责
适用场景
- 聊天室
- MVC架构
- 事件总线
- GUI组件协调
- 系统间通信协调
注意事项
中介者不应过于复杂,必要时拆分
同事对象只与中介者交互
中介者协调逻辑应清晰
可结合观察者模式实现事件通知
要点总结
- 中介者模式集中管理对象交互
- Colleague只与Mediator通信
- Mediator转发消息,协调对象行为
- 降低对象间耦合,交互逻辑集中
- MVC的Controller、聊天室是典型应用
📝 发现内容有误?点击此处直接编辑