设计模式 - 行为型 - 中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)是一种行为型设计模式,通过引入一个中介者对象来封装一组对象之间的交互,从而减少对象间的直接依赖,降低系统复杂度。该模式将对象间的网状通信结构转换为星型结构,使交互逻辑集中管理,提升系统的可维护性和扩展性。以下是系统性解析:


一、核心定义与设计目标

  1. 定义
    中介者模式通过集中式协调机制,让多个对象(称为同事对象)不再直接相互引用,而是通过中介者进行通信。例如,聊天室中的用户不直接互发消息,而是通过聊天服务器中转。其核心思想是**“解耦对象间的复杂交互”**。

  2. 设计目标

    • 解耦对象关系:避免同事对象间的直接依赖,降低耦合度。
    • 集中管理交互:将分散的交互逻辑收拢到中介者中,简化对象职责。
    • 动态扩展性:新增同事类或修改交互规则时,无需修改其他对象。

二、模式结构与角色划分

  1. 核心角色

    • 抽象中介者(Mediator):定义与同事对象通信的接口(如 sendMessage())。
    • 具体中介者(ConcreteMediator):实现协调逻辑,维护同事对象引用(如 ChatServer 管理用户列表)。
    • 抽象同事类(Colleague):声明与中介者交互的方法(如 setMediator())。
    • 具体同事类(ConcreteColleague):实现业务逻辑,通过中介者间接与其他同事交互(如 User 发送消息)。
  2. UML类图示例

+-------------------+           +-------------------+
|    Mediator        |<|------|>| Colleague         |
| +notify()          |          | +setMediator()    |
+-------------------+           +-------------------+
       ▲                              ▲
       |                              |
+-------------------+          +-------------------+
| ConcreteMediator  |          | ConcreteColleague |
| +notify()         |          | +send()           |
+-------------------+          +-------------------+
  1. 交互流程
    • 同事对象将请求发送给中介者,中介者根据逻辑转发给相关同事。
    • 例如:用户A发送消息→中介者接收→判断接收者→转发给用户B。

三、优缺点分析

优点
  1. 松散耦合:同事对象仅依赖中介者,而非彼此。
  2. 简化维护:交互逻辑集中管理,避免代码分散。
  3. 灵活扩展:新增同事类只需注册到中介者,不影响其他对象。
缺点
  1. 中介者复杂度高:中介者类可能成为“上帝对象”,承担过多职责。
  2. 性能损耗:中介者集中处理请求,高频场景可能成为瓶颈。

四、适用场景

  1. 复杂交互系统
    • GUI控件交互(如表单验证联动)。
    • 多玩家游戏中的角色通信。
  2. 分布式协调
    • 微服务架构中的服务调用协调。
  3. 事件驱动架构
    • 消息队列中的事件路由(如订单状态更新通知)。
  4. 网状结构优化
    • 将对象间的网状依赖转换为星型结构。

五、实现示例(Java)

以聊天室为例:

// 1. 抽象中介者
interface ChatMediator {
    void sendMessage(String msg, User user);
    void addUser(User user);
}

// 2. 具体中介者
class ChatServer implements ChatMediator {
    private List<User> users = new ArrayList<>();
    @Override public void addUser(User u) { users.add(u); }
    @Override public void sendMessage(String msg, User sender) {
        users.stream()
            .filter(u -> u != sender)
            .forEach(u -> u.receive(msg));
    }
}

// 3. 抽象同事类
abstract class User {
    protected ChatMediator mediator;
    public User(ChatMediator m) { this.mediator = m; }
    public abstract void send(String msg);
    public abstract void receive(String msg);
}

// 4. 具体同事类
class ChatUser extends User {
    public ChatUser(ChatMediator m) { super(m); }
    @Override public void send(String msg) { mediator.sendMessage(msg, this); }
    @Override public void receive(String msg) { System.out.println("收到消息:" + msg); }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        ChatMediator server = new ChatServer();
        User alice = new ChatUser(server);
        User bob = new ChatUser(server);
        server.addUser(alice); server.addUser(bob);
        alice.send("你好!");  // Bob收到消息
    }
}

六、实际应用案例

  1. Java Swing事件处理
    • 按钮、文本框等组件通过 ActionListener 中介者协调事件响应。
  2. Spring框架中的事件机制
    • ApplicationEventMulticaster 作为中介者,管理事件发布与监听。
  3. 航空调度系统
    • 控制塔(中介者)协调航班起降,避免飞机直接通信。

七、与其他模式的对比

模式核心差异
观察者模式观察者模式是分布式的,中介者模式是集中式的
门面模式门面模式封装子系统接口,中介者模式协调平等对象间的交互
代理模式代理模式控制对象访问,中介者模式协调对象间通信

八、总结

中介者模式通过引入协调层,有效解决了对象间复杂交互导致的耦合问题,尤其适用于网状通信结构的系统重构。其核心价值在于将分散的交互逻辑集中化,但需警惕中介者类的职责过载性能瓶颈。实际开发中,可结合职责链模式分散中介者压力,或利用异步消息队列提升吞吐量。对于需要统一管理对象交互的场景(如GUI、分布式系统),该模式是降低耦合、提升可维护性的理想选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值