中介者模式 (Mediator Pattern) 详细介绍

一、模式概述
  • 英文名称:Mediator

  • 核心目标:定义一个中介对象来封装一组对象之间的交互,减少对象间直接通信的复杂性,促进松耦合。

  • 设计思想:通过集中控制交互逻辑,将网状的多对多通信转化为星型的一对多结构,简化系统维护。


二、优缺点
优点缺点
1. 减少对象间依赖:对象仅与中介交互,降低耦合。1. 中介类复杂度高:可能成为“上帝类”。
2. 简化对象间协作:交互逻辑集中管理。2. 性能瓶颈:中介类处理大量通信可能成为性能瓶颈。
3. 易于扩展新对象:新增对象只需修改中介类。3. 设计难度大:需精准划分对象职责。

三、应用场景
  1. 聊天室系统:用户间消息通过聊天室中转。

  2. 航空调度系统:塔台协调飞机起飞、降落。

  3. GUI 组件交互:表单输入控件间的联动(如选择国家后更新城市列表)。

  4. 微服务协调:服务间通过 API 网关通信。


四、代码实现与注释
1. 中介者接口(定义通信规范)

/**
 * 中介者接口:定义组件间通信的方法
 */
public interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}
2. 同事类接口(定义组件行为)

/**
 * 同事类接口:定义用户的基本行为
 */
public abstract class User {
    protected ChatMediator mediator;
    protected String name;

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

    // 发送消息(委托给中介者)
    public abstract void send(String message);

    // 接收消息
    public abstract void receive(String message);
}
3. 具体中介者类(实现协调逻辑)

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

/**
 * 具体中介者:聊天室(管理用户并转发消息)
 */
public class ChatRoom implements ChatMediator {
    private final List<User> users = new ArrayList<>();

    @Override
    public void addUser(User user) {
        users.add(user);
        System.out.println(user.name + " 加入聊天室");
    }

    @Override
    public void sendMessage(String message, User sender) {
        // 向除发送者外的所有用户广播消息
        for (User user : users) {
            if (user != sender) {
                user.receive(sender.name + " 说:" + message);
            }
        }
    }
}
4. 具体同事类(用户实现)

/**
 * 普通用户:通过中介者发送消息
 */
public class BasicUser extends User {
    public BasicUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }

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

    @Override
    public void receive(String message) {
        System.out.println(name + " 收到消息:" + message);
    }
}

/**
 * 管理员用户:拥有特殊权限(如发送广播)
 */
public class AdminUser extends User {
    public AdminUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println("[管理员] " + name + " 发送通知:" + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("[管理员] " + name + " 收到消息:" + message);
    }
}
5. 客户端调用

public class Client {
    public static void main(String[] args) {
        // 创建中介者(聊天室)
        ChatMediator chatRoom = new ChatRoom();

        // 创建用户并注册到聊天室
        User alice = new BasicUser(chatRoom, "Alice");
        User bob = new BasicUser(chatRoom, "Bob");
        User admin = new AdminUser(chatRoom, "系统管理员");

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

        // 用户间发送消息(通过中介者转发)
        System.out.println("\n===== 用户消息测试 =====");
        alice.send("大家好!");
        bob.send("欢迎 Alice!");

        System.out.println("\n===== 管理员广播测试 =====");
        admin.send("服务器将于今晚维护!");
    }
}
6. 输出结果

Alice 加入聊天室
Bob 加入聊天室
系统管理员 加入聊天室

===== 用户消息测试 =====
Alice 发送消息:大家好!
Bob 收到消息:Alice 说:大家好!
系统管理员 收到消息:Alice 说:大家好!
Bob 发送消息:欢迎 Alice!
Alice 收到消息:Bob 说:欢迎 Alice!
系统管理员 收到消息:Bob 说:欢迎 Alice!

===== 管理员广播测试 =====
[管理员] 系统管理员 发送通知:服务器将于今晚维护!
Alice 收到消息:系统管理员 说:服务器将于今晚维护!
Bob 收到消息:系统管理员 说:服务器将于今晚维护!

五、模式结构图

+----------------+          +----------------+
|   Mediator     | <------+ |   Colleague    |
+----------------+          +----------------+
| +notify()      |          | -mediator:Mediator |
+----------------+          | +send()        |
       ^                    | +receive()     |
       |                    +----------------+
       |
+----------------+
| ConcreteMediator|
+----------------+
| +notify()      |
+----------------+
       |
       |
+----------------+
| ConcreteColleague|
+----------------+
| +send()        |
| +receive()     |
+----------------+

六、与其他模式的关系
  1. 观察者模式:中介者模式可基于观察者模式实现,但更强调双向通信。

  2. 门面模式:中介者协调对象间交互,门面模式简化子系统访问。

  3. 代理模式:中介者可能代理对象间的通信,但目标不同。


七、最佳实践
  1. 合理划分职责:避免中介者类承担过多逻辑,必要时拆分多个中介者。

  2. 接口设计清晰:定义明确的通信协议,避免直接暴露对象细节。

  3. 异步处理:对高并发场景,使用消息队列作为中介者。


八、总结
  • 核心价值:通过集中管理对象交互,降低系统耦合度,提升可维护性。

  • 适用场景:对象间存在复杂网状通信关系的系统(如聊天应用、控制系统)。

  • 关键实现:中介者接口 + 同事类接口 + 协调逻辑。

中介者模式在 Java 生态中的典型应用包括:

  • Java Message Service (JMS):消息队列作为中介者协调生产者与消费者。

  • Spring MVC 的 DispatcherServlet:协调控制器、视图解析器等组件。

  • 事件总线框架:如 Google Guava 的 EventBus。

掌握该模式能有效解决复杂对象交互问题,提升代码的可读性和扩展性。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐