设计模式——中介者设计模式(行为型)

news2025/6/6 0:44:11

摘要

文章详细介绍了中介者设计模式,这是一种行为型设计模式,通过中介者对象封装多个对象间的交互,降低系统耦合度。文中阐述了其核心角色、优缺点、适用场景,并通过类图、时序图、实现方式、实战示例等多方面进行讲解,还探讨了与其他设计模式的组合使用,帮助读者全面理解该模式。

1. 中介者设计模式定义

中介者设计模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介对象来封装多个对象之间的交互,从而使对象之间不再互相引用,降低系统的耦合度,让对象之间的通信通过中介者统一协调。

飞机起降管控系统:多架飞机(同事对象)之间不能自己协调起降,必须通过“塔台”(中介者)统一调度,这样飞机之间不需要知道彼此,只需与塔台通信。

1.1. 📌 核心角色

角色

说明

Mediator

抽象中介者,定义对象之间通信的接口

ConcreteMediator

具体中介者,实现协调各组件之间的交互逻辑

Colleague

同事类,每个与其他对象通信的对象,只与中介者通信

1.2. ✅ 优点

  • 降低对象之间的耦合,避免“网状结构”,变为“星型结构”
  • 交互集中管理,逻辑清晰、易维护
  • 更易于扩展和修改通信规则

1.3. ❌ 缺点

  • 中介者可能变得非常复杂,成为“上帝类”
  • 不适合同事对象数量很少、交互简单的情况

1.4. ✅ 适用场景

  • 多个对象之间存在复杂交互,导致系统结构混乱
  • 希望将对象间的通信行为提取到一个独立类中进行管理
  • 界面组件交互(如按钮、输入框等)、聊天系统、协作系统

2. 中介者设计模式结构

  1. 组件 (Component) 是各种包含业务逻辑的类。 每个组件都有一个指向中介者的引用, 该引用被声明为中介者接口类型。 组件不知道中介者实际所属的类, 因此你可通过将其连接到不同的中介者以使其能在其他程序中复用。
  2. 中介者 (Mediator) 接口声明了与组件交流的方法, 但通常仅包括一个通知方法。 组件可将任意上下文 (包括自己的对象) 作为该方法的参数, 只有这样接收组件和发送者类之间才不会耦合。
  3. 具体中介者 (Concrete Mediator) 封装了多种组件间的关系。 具体中介者通常会保存所有组件的引用并对其进行管理, 甚至有时会对其生命周期进行管理。

2.1. 中介者模式类图

2.2. 中介者模式时序图

3. 中介者设计模式实现方式

中介者设计模式是一种行为型设计模式,通过引入中介对象封装多个对象之间的交互,从而使对象之间不再互相引用,达到松耦合的目的

3.1. 🧱 核心实现结构

3.1.1. 抽象中介者接口(Mediator

定义统一的通信接口,用于同事对象之间的协调。

public interface Mediator {
    void notify(String event, Colleague sender);
}

3.1.2. 抽象同事类(Colleague

每个同事类都持有中介者的引用,只与中介者通信。

public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

3.1.3. 具体同事类(ConcreteColleague

具体的业务类,通过调用中介者来进行通信。

public class ConcreteColleagueA extends Colleague {
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    public void doSomething() {
        System.out.println("ColleagueA 执行操作,通知中介者");
        mediator.notify("A完成", this);
    }

    public void receive(String msg) {
        System.out.println("ColleagueA 收到消息:" + msg);
    }
}
public class ConcreteColleagueB extends Colleague {
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    public void doSomething() {
        System.out.println("ColleagueB 执行操作,通知中介者");
        mediator.notify("B完成", this);
    }

    public void receive(String msg) {
        System.out.println("ColleagueB 收到消息:" + msg);
    }
}

3.1.4. 具体中介者类(ConcreteMediator

负责协调同事类之间的通信逻辑。

public class ConcreteMediator implements Mediator {
    private ConcreteColleagueA colleagueA;
    private ConcreteColleagueB colleagueB;

    public void setColleagueA(ConcreteColleagueA a) {
        this.colleagueA = a;
    }

    public void setColleagueB(ConcreteColleagueB b) {
        this.colleagueB = b;
    }

    @Override
    public void notify(String event, Colleague sender) {
        if (sender == colleagueA) {
            colleagueB.receive("来自A的通知:" + event);
        } else if (sender == colleagueB) {
            colleagueA.receive("来自B的通知:" + event);
        }
    }
}

3.2. 🛠 测试用例

public class Main {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

        ConcreteColleagueA a = new ConcreteColleagueA(mediator);
        ConcreteColleagueB b = new ConcreteColleagueB(mediator);

        mediator.setColleagueA(a);
        mediator.setColleagueB(b);

        a.doSomething();
        b.doSomething();
    }
}

3.3. ✅ 输出示例

ColleagueA 执行操作,通知中介者
ColleagueB 收到消息:来自A的通知:A完成
ColleagueB 执行操作,通知中介者
ColleagueA 收到消息:来自B的通知:B完成

3.4. 🧩 中介者示例总结

角色

职责

Mediator

定义中介者接口,协调同事之间的通信

ConcreteMediator

持有所有同事的引用,封装对象间交互逻辑

Colleague

持有中介者引用,通过中介者与其他对象交互,不直接引用其他对象

应用价值

解耦多个对象间复杂的网状关系,转化为中心化的星型结构,便于扩展和维护

4. 中介者设计模式适合场景

4.1. ✅ 中介者设计模式适合场景

场景描述

说明

多个对象间复杂交互

对象之间交互关系复杂且频繁,使用中介者简化对象间直接通信

需要解耦对象之间的依赖

通过中介者集中管理,减少对象之间的耦合,符合单一职责原则

系统中的对象之间通信逻辑经常变化

中介者封装交互逻辑,修改交互规则只需改中介者,不用改对象

多个模块协作实现复杂业务流程

中介者协调不同模块协作,避免各模块直接耦合

需要统一管理和监控对象间通信

中介者作为统一中心,便于增加日志、监控、事务控制等功能

4.2. ❌ 中介者设计模式不适合场景

对象间通信关系简单,耦合不明显

使用中介者会增加不必要的复杂度,直接通信更清晰简单

对象数量非常少

中介者的抽象和管理成本超过了实际收益

性能要求极高,不允许通信中间层增加延迟

中介者引入了额外的转发和协调,可能导致一定的性能损耗

系统逻辑对对象的独立性和自治性要求较高

中介者集中控制会限制对象自治,增加耦合

需要灵活、动态调整对象间通信方式

中介者模式较为静态,频繁调整通信机制可能导致中介者复杂难维护

5. 中介者设计模式实战示例

下面给你一个基于Spring框架,使用注解注入,非构造函数注入的中介者设计模式实战示例,场景是简化版金融风控系统中多个风控模块(比如信用评分模块、额度计算模块)之间的协作。

5.1. 设计思路

  • 中介者接口:定义协调各风控模块交互的方法
  • 具体中介者类:实现接口,注入各风控模块,协调调用
  • 风控模块接口:所有风控模块统一接口
  • 具体风控模块实现类:业务模块实现

5.2. 中介者接口

public interface RiskMediator {
    void execute(String action);
}

5.3. 风控模块接口

public interface RiskModule {
    void check();
}

5.4. 具体风控模块实现

import org.springframework.stereotype.Component;

@Component
public class CreditScoreModule implements RiskModule {
    @Override
    public void check() {
        System.out.println("信用评分模块风控校验...");
    }
}

@Component
public class CreditLimitModule implements RiskModule {
    @Override
    public void check() {
        System.out.println("额度计算模块风控校验...");
    }
}

5.5. 具体中介者实现(协调模块)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class RiskMediatorImpl implements RiskMediator {

    // 非构造函数注入
    @Autowired
    private CreditScoreModule creditScoreModule;

    @Autowired
    private CreditLimitModule creditLimitModule;

    @Override
    public void execute(String action) {
        switch (action) {
            case "creditCheck":
                creditScoreModule.check();
                break;
            case "limitCheck":
                creditLimitModule.check();
                break;
            case "allCheck":
                creditScoreModule.check();
                creditLimitModule.check();
                break;
            default:
                System.out.println("未知操作");
        }
    }
}

5.6. 业务调用示例(Service)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RiskService {

    @Autowired
    private RiskMediator riskMediator;

    public void performRiskCheck() {
        System.out.println("开始风控校验...");
        riskMediator.execute("allCheck");
        System.out.println("风控校验完成");
    }
}

5.7. Spring Boot 主程序测试

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RiskControlApplication implements CommandLineRunner {

    @Autowired
    private RiskService riskService;

    public static void main(String[] args) {
        SpringApplication.run(RiskControlApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        riskService.performRiskCheck();
    }
}

5.8. 运行结果

复制编辑
开始风控校验...
信用评分模块风控校验...
额度计算模块风控校验...
风控校验完成

说明

  • 中介者对象负责协调多个风控模块,调用对应方法完成协作。
  • 如果以后需要新增风控模块,只需在中介者类中添加对应依赖并扩展 execute 方法即可。
  • 解耦风控模块之间的直接调用,实现灵活协作。

6. 中介者设计模式思考

6.1. 中介者设计模式常和以下设计模式组合使用,提升系统解耦性、灵活性和可维护性?

设计模式

作用

组合理由

观察者模式

事件通知,模块状态变更监听

松耦合,异步通知

策略模式

不同处理策略动态切换

灵活行为管理

命令模式

请求封装,支持撤销、排队

请求管理解耦

责任链模式

按顺序处理请求

流程控制与模块责任划分

工厂模式

创建模块实例

解耦模块实例化

状态模式

根据状态改变行为

简化状态管理,增强灵活性

6.1.1. 观察者模式(Observer Pattern)

  • 场景:中介者作为事件中心,监听模块状态变化并通知相关模块。
  • 组合效果:模块状态变化由中介者发起事件通知,避免模块间直接依赖,实现松耦合。

6.1.2. 策略模式(Strategy Pattern)

  • 场景:中介者根据不同场景或条件,动态选择不同的处理策略。
  • 组合效果:中介者协调不同策略,提升行为灵活性和可扩展性。

6.1.3. 命令模式(Command Pattern)

  • 场景:将请求封装成命令对象,中介者负责调用命令,支持请求排队、撤销等操作。
  • 组合效果:使请求调用和执行解耦,中介者集中管理命令执行。

6.1.4. 责任链模式(Chain of Responsibility Pattern)

  • 场景:多个模块按顺序处理请求,中介者组织责任链,协调链上的处理步骤。
  • 组合效果:流程化请求处理,增强模块间协作的灵活控制。

6.1.5. 工厂模式(Factory Pattern)

  • 场景:中介者创建或获取模块实例,通过工厂解耦模块创建细节。
  • 组合效果:提高模块实例管理灵活性,便于模块替换和扩展。

6.1.6. 状态模式(State Pattern)

  • 场景:中介者根据系统或模块状态变化,动态调整模块行为。
  • 组合效果:将状态和行为分离,简化中介者的决策逻辑。

6.2. 中介者和观察者模式实战示例

6.2.1. 适用场景对比

模式

适用场景

特点

中介者模式

多个组件之间复杂协作、行为依赖,强交互逻辑需要统一协调

强中心化,便于流程控制、逻辑清晰,但中介者本身易变复杂

观察者模式

一个对象状态变化需通知多个对象,多个模块监听某事件或行为

弱耦合、支持异步,适合事件驱动架构,但流程控制不集中,追踪困难

6.2.2. ✅ 场景 1:金融风控审批系统(使用中介者模式)

业务背景: 用户提交贷款申请,需依次经过以下模块:

  • 黑名单检查
  • 身份实名认证
  • 反欺诈评分
  • 授信额度计算
    这些模块相互有顺序依赖,并存在交互控制。

✅ 实现方式(中介者模式):

@Component
public class RiskMediator {

    @Autowired private BlacklistChecker blacklistChecker;
    @Autowired private IdentityVerifier identityVerifier;
    @Autowired private AntiFraudEngine antiFraudEngine;
    @Autowired private CreditScoreCalculator creditScoreCalculator;

    public RiskResult process(UserApplyDTO apply) {
        if (!blacklistChecker.check(apply)) return RiskResult.reject("黑名单");
        if (!identityVerifier.verify(apply)) return RiskResult.reject("身份校验失败");
        FraudResult fraud = antiFraudEngine.analyze(apply);
        if (fraud.isHighRisk()) return RiskResult.reject("欺诈嫌疑");
        return creditScoreCalculator.calculate(apply);
    }
}

所有风控组件之间不直接通信,由 RiskMediator 协调。

6.2.3. ✅ 场景 2:用户注册发送通知(使用观察者模式)

业务背景: 用户注册成功后,需要:

  • 发送欢迎短信
  • 推送用户画像同步任务
  • 发放注册优惠券

这三个操作彼此独立,不影响主流程。

✅ 实现方式(观察者模式 + Spring Event):

定义事件对象:

public class UserRegisterEvent extends ApplicationEvent {
    private final Long userId;
    public UserRegisterEvent(Object source, Long userId) {
        super(source);
        this.userId = userId;
    }
    public Long getUserId() { return userId; }
}

发布事件:

@Component
public class UserService {
    @Autowired private ApplicationEventPublisher publisher;

    public void register(UserDTO dto) {
        // 注册逻辑...
        publisher.publishEvent(new UserRegisterEvent(this, dto.getId()));
    }
}

监听器(观察者):

@Component
public class WelcomeSmsListener {
    @EventListener
    public void onRegister(UserRegisterEvent event) {
        // 发送短信
    }
}

@Component
public class ProfileSyncListener {
    @EventListener
    public void onRegister(UserRegisterEvent event) {
        // 同步画像
    }
}

Spring 自动管理监听器注册,模块间完全解耦,扩展方便。

6.3. ✅ 中介者和观察者模式总结

目标

推荐模式

理由

统一控制业务流程

中介者模式

控制逻辑集中,适合复杂流程协调

模块间异步通知

观察者模式

低耦合、事件驱动、支持多个订阅方

需要响应式扩展通知

观察者模式

任意监听器可接入或移除,灵活扩展

模块依赖顺序较强

中介者模式

控制好执行顺序,模块逻辑依赖清晰

博文参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2398020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)

文章目录 1、MinGW的定义2、MinGW的主要组件3、MinGW-w64下载与安装 3.1、下载解压安装地址3.2、MinGW-w64环境变量的设置 4、验证MinGW是否安装成功5、编写一段简单的代码验证下6、总结 1、MinGW的定义 MinGW(Minimalist GNU for Windows) 是一个用…

LabVIEW磁悬浮轴承传感器故障识别

针对工业高端装备中主动磁悬浮轴承(AMB)的位移传感器故障检测需求,基于 LabVIEW 平台构建了一套高精度故障识别系统。通过集成品牌硬件与 LabVIEW 的信号处理能力,实现了传感器探头故障的实时监测与精准定位,解决了传统…

多线程1(Thread)

认识线程(Thread) 在进程中,要创建一个进程和销毁一个进程所消耗的硬件和软件资源是巨大的,因此为了优化上述过程,我们引入了“线程”。 线程是系统调度的基本单位。 1)线程和进程的关系 可以认为进程包…

NVIDIA DOCA 3.0:引领AI基础设施革命的引擎简析

引言 在当今快速发展的AI时代,大规模AI模型的训练和部署对数据中心基础设施提出了前所未有的挑战。传统的CPU-centric架构已经难以满足超大规模AI工作负载对性能、效率和安全性的需求。NVIDIA于2025年4月正式发布了DOCA 3.0软件框架,这一创新性平台彻底改变了AI基础设施的设计…

小家电外贸出口新利器:WD8001低成本风扇智能控制方案全解析

低成本单节电池风扇解决方案WD8001 用途 低成本单节电池风扇解决方案WD8001用于小功率风扇供电及控制,具有三个档位调节、自动停机及锁机功能。 基本参数 充电参数:输入5V/500mA,满电4.2V,充电指示灯亮,满电后熄灭…

C++实现汉诺塔游戏用户交互

目录 一、模型调整(一)模型定义(二)模型实现1.电脑自动完成部分2.SDL图形显示2.1拿起放下盘子的函数2.2左右移动手指的函数 二、处理用户输入,进行人机分流三、总结四、源码下载 上篇文章使用C语言实现汉诺塔游戏电脑自动完成的步骤,还没有实现用户交互&…

谷歌地图手机版(Google maps)v11.152.0100安卓版 - 前端工具导航

谷歌地图(Google maps)是由谷歌官方推出的一款手机地图应用。软件功能强大,支持本地搜索查找世界各地的地址、地点和商家;支持在街景视图中查看世界各地的360度全景图;支持查找乘坐火车、公交车和地铁的路线,或者查找步行路线等 …

C++核心编程_关系运算符重载

4.5.5 关系运算符重载 作用:重载关系运算符,可以让两个自定义类型对象进行对比操作 /*#### 4.5.5 关系运算符重载 **作用:**重载关系运算符,可以让两个自定义类型对象进行对比操作 */class Person { public:Person(string name, …

T/CCSA 663-2025《医疗科研云平台技术要求》标准解读与深度分析

参考地址:https://www.doc88.com/p-30280431175529.html 引言 随着医疗信息化建设的深入推进,医疗行业正经历从"业务驱动"向"数据驱动"的转型。在这一背景下,中国通信标准化协会(CCSA)于2025年发布了T/CCSA 663-2025《医疗科研云平台技术要求》标准,并…

win11回收站中出现:查看回收站中是否有以下项: WPS云盘回收站

好久没更新了,首先祝所有大朋友、小朋友六一儿童节快乐,真的希望我们永远都不会长大呀,长大真的好累呀(•_•) 免责声明 笔者先来个免责声明吧,被网上的阴暗面吓到了 若读者参照笔者的这篇文章所执行的操作中途或后续出现的任何…

SCDN如何同时保障网站加速与DDoS防御?

在互联网时代,网站既要面对用户访问量的激增,又要抵御层出不穷的网络攻击,特别是DDoS攻击的威胁。SCDN(安全内容分发网络)作为融合加速与安全的解决方案,如何实现“加速”与“防御”的双重保障?…

项目前置知识——不定参以及设计模式

1.C语言不定参宏函数 c语言中&#xff0c;printf就是一个不定参函数&#xff0c;在使用不定参宏函数时&#xff0c;我们使用__VA_ARGS__来解析不定参&#xff1a; #include <iostream> #include <cstdarg>#define LOG(fmt/*格式*/, .../*用...表示不定参*/) prin…

04powerbi-度量值-筛选引擎CALCULATE()

1、calculate calculate 的参数分两部分&#xff0c;分别是计算器和筛选器 2、多条件calculater与表筛选 多条件有不列的多条件 相同列的多条件 3、calculatertable &#xff08;表&#xff0c;筛选条件&#xff09;表筛选 与calculate用法一样&#xff0c;可以用创建表&…

chromedriver 下载失败

问题描述 chromedriver 2.46.0 下载失败 淘宝https://registry.npmmirror.com/chromedriver/2.46/chromedriver_win32.zip无法下载 解决方法 找到可下载源 https://cdn.npmmirror.com/binaries/chromedriver/2.46/chromedriver_win32.zip &#xff0c;先将其下载到本地目录(D…

Weather app using Django - Python

我们的任务是使用 Django 创建一个 Weather 应用程序&#xff0c;让用户可以输入城市名称并查看当前天气详细信息&#xff0c;例如温度、湿度和压力。我们将通过设置一个 Django 项目&#xff0c;创建一个视图来从 OpenWeatherMap API 获取数据&#xff0c;并设计一个简单的模板…

机器视觉2,硬件选型

机器视觉1&#xff0c;学习了硬件的基本知识和选型&#xff0c;现在另外的教材巩固知识 选相机 工业相机选型的保姆级教程_哔哩哔哩_bilibili 1.先看精度多少mm&#xff0c;被检测物体长宽多少mm》分辨率&#xff0c; 选出合理范围内的相机 2.靶面尺寸&#xff0c;得出分…

电阻电容的选型

一、电阻选型 1.1安装方式 贴片电阻体积小&#xff0c;适用于SMT生产&#xff1b;功率小&#xff1b;易拆解插件电阻体积大&#xff1b;功率大&#xff1b;不易脱落 1.2阻值 电阻的阻值是离散的&#xff0c;其标称阻值根据精度分为E6、E12、E24、E48、E96、E192六大系列&am…

12.springCloud AlibabaSentinel实现熔断与限流

目录 一、Sentinel简介 1.官网 2.Sentinel 是什么 3.Sentinel 的历史 4.Sentinel 基本概念 资源 规则 5.Sentinel 功能和设计理念 (1).流量控制 什么是流量控制 流量控制设计理念 (2).断降级 什么是熔断降级 熔断降级设计理念 (3).系统自适应保护 6.主要工作机制…

vSOME/IP与ETAS DSOME/IP通信的问题解决方案

✅ 一、服务版本不匹配导致 Handover 问题 —— 需要更新 VSOMEIP 代码逻辑 📌 问题描述: 在 SOME/IP 通信中,发布者(offer)与订阅者(subscribe)之间存在服务版本不一致的问题,导致 Handover(切换)失败。 ✅ 解决方案: 需要在 offer_service 和 subscribe 接口中…

软考-系统架构设计师-第十五章 信息系统架构设计理论与实践

信息系统架构设计理论与实践 15.2 信息系统架构风格和分类15.3 信息系统常用的架构模型15.4 企业信息系统总体框架15.5 信息系统架构设计方法 15.2 信息系统架构风格和分类 信息系统架构风格 数据流体系结构风格&#xff1a;批处理、管道-过滤器调用/返回体系结构风格&#x…