深入理解设计模式之中介者模式

深入理解设计模式之:中介者模式(Mediator Pattern)

一、什么是中介者模式?

中介者模式(Mediator Pattern)是一种行为型设计模式。它通过引入一个中介对象,来封装一组对象之间的交互,使对象之间不再直接引用彼此,而是通过中介者进行通信,从而降低对象之间的耦合度,便于系统的扩展和维护。

核心思想:

将对象之间复杂的网状关系变为星型结构,所有对象只与中介者交互。


二、应用场景

  • GUI 界面组件之间的交互(如按钮、文本框、下拉框等)
  • 聊天室、消息总线、事件总线
  • 机场调度、交通信号灯等需要统一协调的场景
  • Spring ApplicationContext、事件发布机制

三、模式结构

  • Mediator(抽象中介者):定义同事对象之间通信的接口
  • ConcreteMediator(具体中介者):实现协调各同事对象的通信
  • Colleague(同事类):各参与交互的对象,持有中介者引用

四、UML 类图

复制代码
+-------------------+
|    Mediator       |<-------------------+
+-------------------+                    |
| +notify()         |                    |
+-------------------+                    |
        /_\                              |
         |                               |
+---------------------+         +---------------------+
| ConcreteMediator    |         |   Colleague         |
+---------------------+         +---------------------+
| +notify()           |         | mediator: Mediator  |
| +register()         |         | +send()             |
+---------------------+         | +receive()          |
                                +---------------------+
                                        /_\
                                         |
                        +----------------+----------------+
                        |                                 |
              +-------------------+             +-------------------+
              | ColleagueA        |             | ColleagueB        |
              +-------------------+             +-------------------+

五、Java 实现代码示例

1. 抽象中介者

java 复制代码
public interface Mediator {
    void send(String message, Colleague colleague);
}

2. 抽象同事类

java 复制代码
public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

3. 具体同事类

java 复制代码
public class ColleagueA extends Colleague {
    public ColleagueA(Mediator mediator) {
        super(mediator);
    }

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

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

public class ColleagueB extends Colleague {
    public ColleagueB(Mediator mediator) {
        super(mediator);
    }

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

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

4. 具体中介者

java 复制代码
public class ConcreteMediator implements Mediator {
    private ColleagueA colleagueA;
    private ColleagueB colleagueB;

    public void setColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void setColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }

    @Override
    public void send(String message, Colleague colleague) {
        if (colleague == colleagueA) {
            colleagueB.receive(message);
        } else if (colleague == colleagueB) {
            colleagueA.receive(message);
        }
    }
}

5. 客户端调用

java 复制代码
public class Main {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        ColleagueA a = new ColleagueA(mediator);
        ColleagueB b = new ColleagueB(mediator);

        mediator.setColleagueA(a);
        mediator.setColleagueB(b);

        a.send("你好,B!");
        b.send("你好,A!");
    }
}

输出:

复制代码
ColleagueA 发送消息: 你好,B!
ColleagueB 收到消息: 你好,B!
ColleagueB 发送消息: 你好,A!
ColleagueA 收到消息: 你好,A!

六、优缺点

优点:

  • 降低对象之间的耦合度,便于扩展和维护
  • 集中管理对象间的交互,逻辑清晰
  • 易于增加新同事类和中介者

缺点:

  • 中介者可能变得过于复杂,成为"上帝类"
  • 过多的中介逻辑可能影响性能和可维护性

七、实际应用举例

  • 聊天室中的消息转发
  • GUI 组件事件协调
  • Spring 事件发布机制
  • 业务流程编排引擎

八、总结

中介者模式是解耦对象间复杂交互的有效手段,适合多对象协作、交互复杂的场景。掌握中介者模式有助于编写高内聚、低耦合的系统架构。

建议:

  • 适用于对象间交互复杂、变化频繁的系统
  • 注意中介者的复杂度,避免成为"上帝类"

如需更多设计模式讲解或源码分析,欢迎留言交流!

相关推荐
workflower14 小时前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly768916 小时前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
AI人工智能+电脑小能手18 小时前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
略略略咯咯1 天前
(总结)设计模式
设计模式
Cosolar2 天前
DeepSeek Harness 理解 Harness 的设计哲学 - 可组合的插件运行时
人工智能·设计模式·架构
Nebula_g2 天前
JavaSE基础语法:特殊类(特殊情景下的设计模式)
java·开发语言·设计模式
George_Ye2 天前
同一本书,一人一份:我如何设计 AI 个性化扫书报告
设计模式
莫得感情 o3 天前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
AI人工智能+电脑小能手4 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu4 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理