Skip to content

中介者模式解决"对象间网状通信导致的耦合爆炸"——让所有通信都经过一个中介者,把网状关系变成星形关系。聊天室、机场调度就是它的场景。这篇讲清它怎么降低耦合。

一、解决什么问题:网状通信耦合爆炸

多个对象互相通信(A 给 B 发消息、B 给 C 发消息、C 给 A 发消息),对象之间形成网状关系,每个对象都要认识其他所有对象,耦合爆炸。

中介者模式:所有对象都只认识"中介者",通信都发给中介者,由中介者转发,网状变星形。

二、核心结构(聊天室)

java
// 中介者:聊天室,负责转发消息
class ChatRoom {
    private List<User> users = new ArrayList<>();

    void register(User u) { users.add(u); }

    void send(User from, String message) {
        for (User u : users) {
            if (u != from) u.receive(message);   // 中介者转发给其他所有人
        }
    }
}

// 同事:用户,只认识聊天室,不认识其他用户
class User {
    private String name;
    private ChatRoom room;   // 只依赖中介者

    User(String name, ChatRoom room) { this.name = name; this.room = room; }

    void send(String message) {
        room.send(this, name + " 说:" + message);   // 发给中介者,由它转发
    }
    void receive(String message) { System.out.println(name + " 收到:" + message); }
}

关键User 只依赖 ChatRoom(中介者),不认识其他 User。加新用户、改通信逻辑,只需改中介者,用户类不动。

三、核心价值

  • 降低耦合:对象从"认识所有对象"变成"只认识中介者"
  • 集中通信逻辑:路由、转发逻辑集中在中介者里

四、实际应用

  • 聊天室:用户不直接发消息,都经过聊天室
  • 机场调度塔:飞机不直接交流,都听塔台调度
  • 微服务网关/消息总线:服务间通信经过总线,不点对点直连

小结

  • 中介者让对象通信都经过一个中间人,网状变星形,降低耦合
  • 典型:聊天室、机场调度、消息总线

相关:《观察者模式》(观察者是"一对多通知",中介者是"多对多通信中转",容易混)。