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

文章目录


前言

当一个系统中对象之间交互非常多、互相依赖错综复杂 时,会形成一张"蜘蛛网"结构: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. 最适合:多对象复杂交互场景
相关推荐
sanzk5 小时前
工厂方法模式
设计模式
大数据新鸟7 小时前
设计模式详解——外观模式
设计模式·外观模式
缘友一世8 小时前
PentestGPT V2源码研究之工具层设计模式
设计模式
yinghuoAI20269 小时前
电商视觉进入“无人区”:萤火AI如何用三把“手术刀”重构设计 workflow
设计模式·新媒体运营·产品运营·流量运营·用户运营·内容运营·设计规范
sg_knight9 小时前
设计模式实战:观察者模式(Observer)
python·观察者模式·设计模式
Yu_Lijing11 小时前
基于C++的《Head First设计模式》笔记——MVC模式
c++·笔记·设计模式
无籽西瓜a11 小时前
【西瓜带你学设计模式 | 第十期 - 外观模式】外观模式 —— 子系统封装实现、优缺点与适用场景
java·后端·设计模式·软件工程·外观模式
han_11 小时前
JavaScript设计模式(八):命令模式实现与应用
前端·javascript·设计模式
无籽西瓜a12 小时前
【西瓜带你学设计模式 | 第九期 - 代理模式】代理模式 —— 静态与动态代理实现、优缺点与适用场景
java·后端·设计模式·软件工程·代理模式