【设计模式】行为型-中介者模式

文章目录


前言

  当一个系统中对象之间交互非常多、互相依赖错综复杂 时,会形成一张"蜘蛛网"结构:A依赖B、B依赖C、C依赖A、D依赖所有人......这种网状耦合 会让代码极难维护、扩展、调试。中介者模式 就是用来把网状结构变成星型结构,让所有对象只和中介者通信,大幅降低耦合。


一、概念

  中介者模式(Mediator Pattern) 是一种行为型设计模式 ,核心思想:
用一个中介对象封装一系列对象之间的交互,使各个对象不需要显式相互引用,从而降低耦合,并且可以独立改变它们之间的交互。

  简单理解:

  • 把多对多 → 变成一对多
  • 所有组件只认识中介者,不认识彼此
  • 交互逻辑全部集中在中介者

一句话总结:
取消网状依赖,统一由中介者调度。


二、核心结构

  1. Mediator(抽象中介者)
    定义同事对象通信接口。
  2. ConcreteMediator(具体中介者)
    协调各同事,维护所有同事引用,处理交互逻辑。
  3. Colleague(抽象同事)
    持有中介者引用。
  4. ConcreteColleague(具体同事)
    只和中介者通信,不直接交互。

三、Java 代码实现(聊天室场景)

场景:用户在聊天室发消息,不直接私聊对方 ,而是发给聊天室(中介者),由中介者转发。

1. 抽象中介者

java 复制代码
public interface ChatMediator {
    void sendMessage(String msg, User user);
    void addUser(User user);
}

2. 抽象同事类(User)

java 复制代码
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 msg);
    public abstract void receive(String msg);
}

3. 具体中介者(聊天室)

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class ChatRoom implements ChatMediator {
    private List<User> users = new ArrayList<>();

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

    @Override
    public void sendMessage(String msg, User sender) {
        for (User u : users) {
            // 不发给自己
            if (u != sender) {
                u.receive(sender.name + ": " + msg);
            }
        }
    }
}

4. 具体同事(普通用户)

java 复制代码
public class ChatUser extends User {
    public ChatUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }

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

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

5. 客户端

java 复制代码
public class Client {
    public static void main(String[] args) {
        ChatMediator room = new ChatRoom();

        User alice = new ChatUser(room, "Alice");
        User bob = new ChatUser(room, "Bob");
        User tom = new ChatUser(room, "Tom");

        room.addUser(alice);
        room.addUser(bob);
        room.addUser(tom);

        alice.send("大家好!");
    }
}

输出:

复制代码
Alice 发送: 大家好!
Bob 收到: Alice: 大家好!
Tom 收到: Alice: 大家好!

四、核心变化

  • 网状耦合(烂代码)
    A ↔ B ↔ C ↔ D 互相引用
  • 星型结构(中介者优化)
    A、B、C、D → 只 ↔ Mediator

五、优缺点

优点

  • 彻底简化多对多依赖
  • 集中控制交互逻辑,便于维护
  • 各组件解耦,可独立复用
  • 符合单一职责

缺点

  • 中介者可能过于庞大,变成"上帝类"
  • 复杂度转移到中介者

六、应用场景

  • 聊天室、群聊系统
  • GUI 组件交互(按钮、输入框、表单)
  • 调度中心、网关、控制器
  • 飞机调度塔、交通信号灯
  • 分布式事务协调器

经典源码:

  • Spring MVC DispatcherServlet(核心中介者)
  • Java AWT/Swing 事件机制
  • Netty EventLoop

七、总结

  1. 中介者模式 = 网状依赖 → 星型调度
  2. 核心:所有交互统一由中介者转发
  3. 结构:Mediator + Colleague
  4. 最适合:多对象复杂交互场景
相关推荐
杨充1 天前
11.DDD与战术建模
设计模式·开源·代码规范
杨充1 天前
12.综合实战图片框架
设计模式·开源·代码规范
芝士熊爱编程1 天前
创建型模式-单例模式
java·单例模式·设计模式
咖啡八杯1 天前
GoF设计模式——访问者模式
设计模式·访问者模式
谢栋_1 天前
设计模式从入门到精通之(七)责任链模式
java·设计模式·责任链模式
葬送的代码人生2 天前
别再让 AI 瞎写代码了!Vibe Coding 三步法教你写出靠谱代码
前端·设计模式·架构
无风听海2 天前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式
富贵冼中求2 天前
从单向流到双向 RPC:Agent 通信协议的范式分叉与 ACP 协议实战拆解
设计模式·架构
电子科技圈2 天前
先进封装、芯粒架构和3D集成——先进异构集成亟需兼具标准化与定制化能力的互联及总线IP解决方案
tcp/ip·设计模式·架构·软件构建·代码规范·设计规范
zjun10012 天前
C++:2.工厂模式
设计模式