【设计模式】中介者模式(Mediator)详解

文章目录

    • [1. 引言:对象之间为什么会纠缠不清?](#1. 引言:对象之间为什么会纠缠不清?)
    • [2. 什么是中介者模式](#2. 什么是中介者模式)
      • [GoF 定义](#GoF 定义)
    • [3. 中介者模式的核心思想](#3. 中介者模式的核心思想)
    • [4. 中介者模式的结构](#4. 中介者模式的结构)
    • [5. 示例:聊天室系统](#5. 示例:聊天室系统)
      • [5.1 中介者接口](#5.1 中介者接口)
      • [5.2 具体中介者](#5.2 具体中介者)
      • [5.3 同事类](#5.3 同事类)
      • [5.4 具体同事类](#5.4 具体同事类)
      • [5.5 客户端使用](#5.5 客户端使用)
    • [6. 中介者模式的优点](#6. 中介者模式的优点)
    • [7. 中介者模式的缺点](#7. 中介者模式的缺点)
    • [8. 中介者 vs 观察者 vs 责任链](#8. 中介者 vs 观察者 vs 责任链)
    • [9. JDK / 框架中的中介者思想](#9. JDK / 框架中的中介者思想)
      • [MVC 中的 Controller](#MVC 中的 Controller)
    • [10. 适用场景](#10. 适用场景)
    • [11. 一个常见误区](#11. 一个常见误区)
    • 参考

1. 引言:对象之间为什么会纠缠不清?

在复杂系统中,你可能见过这样的代码:

java 复制代码
class User {
    void send(Message msg, User to) {
        to.receive(msg);
    }
}

随着功能增加:

  • 群聊
  • 在线状态
  • 消息过滤
  • 转发、统计

对象之间开始:

  • 互相引用
  • 逻辑交叉
  • 修改牵一发而动全身

当"对象之间的交互关系"变得复杂时,中介者模式就是解耦利器。

对象不直接聊天,统一找中介。


2. 什么是中介者模式

GoF 定义

用一个中介对象来封装一系列对象交互,使各对象不需要显式地相互引用,从而使其耦合松散。

详细解释:中介者模式,又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。

一句话理解:

对象不再直接交流,统一交给中介。


3. 中介者模式的核心思想

中介者模式的本质是:

  • 把"多对多交互"变成"一对多"
  • 把协作逻辑集中到一个地方
  • 同事对象只依赖中介者

用集中管理,换取对象解耦。


4. 中介者模式的结构

中介者模式包含四个角色:

  1. Mediator(抽象中介者)

它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

  1. ConcreteMediator(具体中介者)

实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

  1. Colleague(同事类)

定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

  1. ConcreteColleague

是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。


5. 示例:聊天室系统

5.1 中介者接口

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

5.2 具体中介者

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

public class ChatRoom implements ChatMediator {

    private List<User> users = new ArrayList<>();

    public void register(User user) {
        users.add(user);
    }

    @Override
    public void sendMessage(String msg, User from) {
        for (User user : users) {
            if (user != from) {
                user.receive(msg);
            }
        }
    }
}

5.3 同事类

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);
}

5.4 具体同事类

java 复制代码
public class ConcreteUser extends User {

    public ConcreteUser(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.5 客户端使用

java 复制代码
ChatRoom chatRoom = new ChatRoom();

User u1 = new ConcreteUser(chatRoom, "Alice");
User u2 = new ConcreteUser(chatRoom, "Bob");

chatRoom.register(u1);
chatRoom.register(u2);

u1.send("你好!");

6. 中介者模式的优点

  1. 解耦对象关系

中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样"牵一处而动全身"了。

  1. 集中管理交互逻辑
  2. 易于维护
  3. 符合单一职责原则

7. 中介者模式的缺点

  1. 中介者可能变得臃肿
  2. 所有逻辑集中,风险集中
  3. 不适合极简单交互

8. 中介者 vs 观察者 vs 责任链

模式 解决的问题
中介者 多对象交互
观察者 事件通知
责任链 请求传递

9. JDK / 框架中的中介者思想

MVC 中的 Controller

  • View 和 Model 不直接通信
  • Controller 作为中介协调

10. 适用场景

  • 聊天系统
  • GUI 组件交互
  • 工作流协调
  • 解耦复杂业务对象

11. 一个常见误区

中介者不是"万能中控",而是"交互协调者"。


参考

中介者模式 | 菜鸟教程

《图解设计模式》

中介 - Java教程 - 廖雪峰的官方网站

中介者设计模式

相关推荐
大猫和小黄1 小时前
Java异常处理:从基础到SpringBoot实战解析
java·开发语言·spring boot·异常
hero.fei2 小时前
kaptcha 验证码生成工具在springboot中集成
java·spring boot·后端
mikelv012 小时前
实现返回树状结构小记
java·数据结构
Duang007_2 小时前
【LeetCodeHot100 超详细Agent启发版本】两数之和 (Two Sum)
java·人工智能·python
色空大师2 小时前
maven引入其他项目依赖爆红
java·maven
yangminlei2 小时前
深入理解Sentinel:分布式系统的流量守卫者
java
JavaEdge.2 小时前
java.io.IOException: Previous writer likely failed to write hdfs报错解决方案
java·开发语言·hdfs
J_liaty2 小时前
基于ip2region.xdb数据库从IP获取到属地解析全攻略
java·网络·后端
沛沛老爹3 小时前
Web转AI架构篇:Agent Skills vs MCP-混合架构设计模式实战指南
java·前端·人工智能·架构·llm·rag