My App

中介者模式

Mediator — 用一个中介对象来封装多个对象之间的交互

一句话理解

多个对象之间不再直接通信,而是通过一个中介者来协调。就像机场的塔台,所有飞机只和塔台通信,不需要互相联系。

解决什么问题

  • N 个对象互相通信,关系是 N×N 的网状结构,复杂且难以维护
  • 用中介者把网状变成星形结构,每个对象只和中介者打交道

怎么写

以"聊天室"为例:

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

    public void join(User user) {
        users.add(user);
        user.setChatRoom(this);
        System.out.println(user.getName() + " 加入了聊天室");
    }

    // 中介者负责转发消息
    public void sendMessage(String message, User sender) {
        for (User user : users) {
            if (user != sender) {
                user.receive(sender.getName() + ": " + message);
            }
        }
    }
}

// 参与者
public class User {
    private final String name;
    private ChatRoom chatRoom;

    public User(String name) { this.name = name; }
    public String getName() { return name; }
    public void setChatRoom(ChatRoom room) { this.chatRoom = room; }

    // 发消息:通过中介者
    public void send(String message) {
        chatRoom.sendMessage(message, this);
    }

    // 收消息
    public void receive(String message) {
        System.out.println(name + " 收到: " + message);
    }
}
ChatRoom room = new ChatRoom();

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

room.join(alice);
room.join(bob);
room.join(charlie);

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

使用场景

  • MVC 中的 Controller —— 协调 Model 和 View
  • 聊天室/消息中间件
  • 航空管制的塔台系统
  • GUI 组件间的交互(对话框中多个控件联动)

On this page