Skip to content
Method约 1 分钟0 个小节更新于 2026/06/19在线编辑

中介者模式

中介者模式用于把多个对象之间复杂的网状关系,收拢到一个中介者对象中。

一句话理解:对象之间不要互相乱连,统一通过中介者沟通。

解决什么问题

当系统中多个对象彼此直接调用时,关系会变成网状:

text
A -> B
A -> C
B -> A
B -> C
C -> A
C -> B

对象越多,依赖越乱。修改一个对象,可能影响一大片。

中介者模式把交互集中到中介者:

text
A -> Mediator <- B
C -> Mediator <- D

对象只认识中介者,不直接认识其他对象。

基本结构

text
Mediator
  <- ColleagueA
  <- ColleagueB
  <- ColleagueC

角色:

  • Mediator:中介者接口,定义对象之间的通信方式。
  • ConcreteMediator:具体中介者,封装交互逻辑。
  • Colleague:同事对象,只和中介者通信。

Java 示例

聊天室就是典型中介者。

中介者接口:

java
interface ChatRoom {
    void send(String from, String message);
}

具体中介者:

java
import java.util.ArrayList;
import java.util.List;

class GroupChatRoom implements ChatRoom {
    private final List<User> users = new ArrayList<>();

    public void join(User user) {
        users.add(user);
    }

    public void send(String from, String message) {
        for (User user : users) {
            if (!user.name().equals(from)) {
                user.receive(from, message);
            }
        }
    }
}

同事对象:

java
class User {
    private final String name;
    private final ChatRoom chatRoom;

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

    public String name() {
        return name;
    }

    public void send(String message) {
        chatRoom.send(name, message);
    }

    public void receive(String from, String message) {
        System.out.println(name + " receive from " + from + ": " + message);
    }
}

使用:

java
GroupChatRoom room = new GroupChatRoom();
User tom = new User("tom", room);
User jack = new User("jack", room);

room.join(tom);
room.join(jack);

tom.send("hello");

用户之间不直接互相持有引用,而是通过聊天室转发消息。

使用场景

  • 聊天室。
  • UI 组件协作。
  • 工作流调度。
  • 事件总线。
  • 多对象交互复杂的模块。

优点

  • 减少对象之间的直接依赖。
  • 交互逻辑集中管理。
  • 对象本身更简单。
  • 方便调整协作流程。

缺点

  • 中介者容易变得很复杂。
  • 所有交互集中到一个地方,可能形成新的上帝类。
  • 中介者出问题会影响整个协作流程。

和观察者模式的区别

模式重点
中介者多个对象之间复杂交互的集中协调
观察者一个对象变化后通知多个观察者

中介者更像“协调中心”,观察者更像“事件通知”。

实战注意

中介者不是为了把所有业务逻辑都塞到一个类里。它适合管理对象之间的交互关系,而不是替代对象自身职责。

以工程实践沉淀知识,以文档复盘成长。