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

文章目录


前言

  当一个系统中对象之间交互非常多、互相依赖错综复杂 时,会形成一张"蜘蛛网"结构: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. 最适合:多对象复杂交互场景
相关推荐
Zane19943 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫4 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19944 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19945 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..5 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1506 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)6 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki7 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅667 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa7 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio