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

文章目录


前言

  当一个系统中对象之间交互非常多、互相依赖错综复杂 时,会形成一张"蜘蛛网"结构: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. 最适合:多对象复杂交互场景
相关推荐
cjz38993 小时前
规则树:把一百行if-else拆成一棵树
设计模式
Adellle5 小时前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
是2的10次方啊6 小时前
设计模式与生活⑱:工资还没焐热,账单已经凑成一摞
设计模式
百思不得小李18 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
爱你真是太好了1 天前
上下文组成以及如何压缩
设计模式
freejackman1 天前
【工程化】从“单兵作战”到“多引擎架构”:基于门面模式的重构实战
大数据·数据库·hive·sql·测试工具·设计模式·架构
Java成神之路-1 天前
从 if-else 到优雅解耦:策略 / 适配器 / 组合模式全流程实战
设计模式
是2的10次方啊2 天前
设计模式与生活⑰:空腹体检,单子领着人走
设计模式
是2的10次方啊2 天前
设计模式与生活⑯:天冷了,出门这身得一层层配
设计模式
心若自由何处是束缚3 天前
适配器模式:从原理到实战的完整指南
设计模式·适配器模式