Skip to content

中介者模式 低频

中介者模式(Mediator Pattern)用一个中介对象来封装一系列对象的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,并且可以独立地改变它们之间的交互。

优缺点

优点缺点
降低多对象间的耦合,对象只需与中介者交互中介者可能变得庞大复杂,承担所有控制逻辑
交互逻辑集中管理,便于维护和修改中介者出问题则整个系统受影响
对象间一对多交互简化为一对一(对象 ↔ 中介者)过度使用会使中介者变成"上帝对象"
新增同事类只需修改中介者(开闭原则的折中)

适用场景

  • 多对象间形成网状依赖,相互引用混乱
  • 对象间交互复杂且行为依赖运行时状态
  • 希望通过中间层解耦通信双方
  • 一组对象以定义良好但复杂的方式进行通信

网状 vs 星形通信

网状(无中介者):
  A ←→ B ←→ C
  ↓     ↓     ↓
  D ←→ E ←→ F
  每个对象都需知道其他所有对象

星形(中介者):
       Mediator
      /   |   \
    A     B     C
    |  /     \  |
    D     E     F
  对象只与中介者通信

中介者模式

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

// 中介者接口
interface Mediator {
    void sendMessage(String message, User sender);
}

// 具体中介者:聊天室
class ChatRoom implements Mediator {
    private final List<User> users = new ArrayList<>();

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

    @Override
    public void sendMessage(String message, User sender) {
        for (User user : users) {
            // 不转发给自己
            if (user != sender) {
                user.receive(message, sender);
            }
        }
    }
}

// 同事类
abstract class User {
    protected String name;
    protected Mediator mediator;

    public User(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    public abstract void send(String message);
    public abstract void receive(String message, User sender);
}

// 具体同事
class ChatUser extends User {
    public ChatUser(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    public void send(String message) {
        System.out.println(name + " 发送: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message, User sender) {
        System.out.println(name + " 收到来自 " + sender.name + ": " + message);
    }
}

// 使用
public class Client {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom();

        User alice = new ChatUser("Alice", chatRoom);
        User bob   = new ChatUser("Bob", chatRoom);
        User charlie = new ChatUser("Charlie", chatRoom);

        chatRoom.addUser(alice);
        chatRoom.addUser(bob);
        chatRoom.addUser(charlie);

        alice.send("大家好!");
        // Bob 收到来自 Alice: 大家好!
        // Charlie 收到来自 Alice: 大家好!
    }
}

与观察者模式的区别

模式通信方式关系
中介者模式对象 ↔ 中介者 ↔ 对象多对多集中管理
观察者模式主题 → 观察者一对多广播

经典应用

  • MVC 架构:Controller 作为 Model 和 View 的中介者
  • 消息中间件:Kafka / RabbitMQ 解耦生产者和消费者
  • Java java.util.Timer:协调任务的调度和执行
  • GUI 组件:对话框作为中介者协调按钮、输入框等子组件

如有转载或 CV 请标注本站原文地址