全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-11 6 分钟 ✍️ juanwangdev

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();
        }
    }
}

中介者模式优点

  1. 降低对象间耦合
  2. 集中交互逻辑
  3. 易于扩展新同事对象
  4. 简化对象通信

中介者模式缺点

  1. 中介者可能变得复杂
  2. 中介者承担过多职责

适用场景

  1. 聊天室
  2. MVC架构
  3. 事件总线
  4. GUI组件协调
  5. 系统间通信协调

注意事项

中介者不应过于复杂,必要时拆分

同事对象只与中介者交互

中介者协调逻辑应清晰

可结合观察者模式实现事件通知

要点总结

  1. 中介者模式集中管理对象交互
  2. Colleague只与Mediator通信
  3. Mediator转发消息,协调对象行为
  4. 降低对象间耦合,交互逻辑集中
  5. MVC的Controller、聊天室是典型应用

📝 发现内容有误?点击此处直接编辑

← 上一篇 线程安全集合
下一篇 → Java享元模式
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库