java23种设计模式(十六) -- 中介者模式(行为设计模式)

微信抢红包神器自动抢软件 阅读详情

中介者模式

简介

中介者模式要解决的就是复杂功能应用之间的重复调用,在这中间添加一层中介者包装服务,对外提供简单、通用、易扩展的服务能力。

这样的设计模式几乎在我们日常生活和实际业务开发中都会见到,例如;飞机🛬降落有小姐姐在塔台喊话、无论哪个方向来的候车都从站台上下、公司的系统中有一个中台专门为你包装所有接口和提供统一的服务等等,这些都运用了中介者模式。除此之外,你用到的一些中间件,他们包装了底层多种数据库的差异化,提供非常简单的方式进行使用。

例如下面这个结构,如果每个元素两两之间要产生联系,关系就会变得错综复杂。

在这里插入图片描述

但是加了中介者之后,相互之间就可以解耦了。变成如下的关系结构。

在这里插入图片描述

角色结构

抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口,用于各同事角色之间的通信。例子中君主类代表的就是这个角色。

具体中介者(ConcreteMediator)角色:具体中介者角色通过协调各同事角色,实现协作行为,为此它要指导并引用各个同事角色。例子中皇上代表的就是这个角色。

同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。例子中老纪跟和二就是代表的这个角色。

代码实现

举例

和二跟老纪都是朝廷大臣,但是互相看不顺眼,在皇上面前和和气气,背地里各自互相参对方。当然有时候皇上颁布旨意时让两个大臣一起合作去完成任务,他们也会相互合作的。和二跟老纪都想收拾对方,但是奈何双方官职不相上下,所以当想收拾对方时就会通过皇上来实现,这个时候我们就当皇上理解为中介者。下面用代码来实现这个过程。

项目结构

在这里插入图片描述

代码

官员抽象类

/**
 * 官员(大臣)抽象类
 */
public abstract class Official {

    protected Monarch monarch;

    /**
     * 每个官员必然要与君主有联系
     * @param monarch
     */
    public Official(Monarch monarch){
        this.monarch = monarch;
    }

    /**
     * 在抽象官员类中添加与中介者取得联系的方法
     * @param monarch
     */
    public void setMonarch(Monarch monarch){
        this.monarch = monarch;
    }

}

君主抽象类

/**
 * 君主抽象类
 */
public abstract class Monarch {

    /**
     * 君主保持着和各个官员的联系
     */
    protected ConcurrentHashMap<String,Official> officials = new ConcurrentHashMap<>();

    /**
     * 录用官员
     * @param name
     * @param official
     */
    public void addOfficial(String name,Official official){
        this.officials.put(name,official);
    }

    /**
     * 将官员革职查办
     * @param name
     */
    public void removeOfficial(String name){
        this.officials.remove(name);
    }

    /**
     * 处理各个官员之间的互相参奏的折子
     * @param name
     * @param method
     */
    public abstract void execute(String name,String method);
}

老纪

/**
 * 老纪
 */
public class LaoJi extends Official{

    /**
     * 每个官员必然要与君主有联系
     *
     * @param monarch
     */
    public LaoJi(Monarch monarch) {
        super(monarch);
    }

    /**
     * 做好本职工作
     */
    public void self(){
        System.out.println("启奏皇上,臣老纪参与编写的四库全书已经完成。");
    }

    /**
     * 参其他官员或与其他官员合作
     */
    public void out(){
        System.out.println("启奏皇上,臣老纪要参和二一本,秀女选拔工作到现在还没完成,理应当革职查办。");
        super.monarch.execute("heEr","self");
    }
}

和二

/**
 * 和二
 */
public class HeEr extends Official {
    /**
     * 每个官员必然要与君主有联系
     *
     * @param monarch
     */
    public HeEr(Monarch monarch) {
        super(monarch);
    }

    /**
     * 做好本职工作
     */
    public void self(){
        System.out.println("启奏皇上,臣和二掌管的秀女选拔工作已经完成。");
    }

    /**
     * 参其他官员或与其他官员合作
     */
    public void out(){
        System.out.println("启奏皇上,臣和二要参老纪一本,四库全书到目前还没编写完成,理应问斩。");
        super.monarch.execute("laoji","self");
    }
}

黄三(乾隆皇上)

/**
 * 黄三(皇上)
 */
public class HuangSan extends Monarch {
    /**
     * 处理各个官员之间的互相参奏的折子
     *
     * @param name
     * @param method
     */
    @Override
    public void execute(String name, String method) {

        //做好自己份内的事情
        if("self".equals(method)){
            if("laoji".equals(name)){
                ((LaoJi)super.officials.get(name)).self();
            }else {
                ((HeEr)super.officials.get(name)).self();
            }
        //我要参别人一本
        }else {
            if("laoji".equals(name)){
                ((LaoJi)super.officials.get(name)).out();
            }else {
                ((LaoJi)super.officials.get(name)).out();
            }
        }

    }
}

测试类

public class ApiTest {

    @Test
    public void testCommand(){
        //创建一个君主
        Monarch monarch = new HuangSan();

        //创建两个官员
        LaoJi laoJi = new LaoJi(monarch);
        HeEr heEr = new HeEr(monarch);

        //君主和两个官员建立关系
        monarch.addOfficial("laoji",laoJi);
        monarch.addOfficial("heEr",heEr);

        //有本奏上,无本退朝。
        //laoJi.self();
        laoJi.out();
        System.out.println("---------------启奏完毕");


        //heEr.self();
        heEr.out();
        System.out.println("---------------启奏完毕");
    }

}

在这里插入图片描述

总结

优点
  1. 中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护扩展,将原本难以理解的网状结构转换成相对简单的星型结构。
  2. 中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合,我们可以独立的改变和复用每一个同事和中介者,增加新的中介者和新的同事类都比较方便,更好的符合“开闭原则”。
  3. 可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须对同事类进行扩展。
缺点

在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

适用场景
  1. 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
  2. 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
  3. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体中介者类。
区块链技术与应用 【全国职业院校技能大赛国赛题目解析】Caliper从0到使用 技能大赛样题解析,caliper题目从0到使用 阅读详情

相关推荐

【python】epub的电子书繁体字与简体字转换

中文繁体与简体转换

xiexianyou666的博客 3088

Java23种设计模式-行为型模式之中介者模式

(ConcreteColleague):每一个具体同事类都实现了在同事类中定义的接口,并且它们都持有一个中介者对象的引用。(Colleague):定义了中介者模式中各个对象的接口,这些对象不直接交互,而是通过中介者对象来进行。(ConcreteMediator):实现了中介者接口,通过具体同事类的对象来改进各同事之间的交互。当对象之间的交互变得非常复杂时,使用中介者模式可以简化对象之间的交互。减少了对象之间的依赖,每个对象不需要知道其他对象的实现细节。当系统中对象很多时,中介者对象可能会变得非常复杂。

csy08845的博客 549

手把手教你接入京东购物小程序:从领券到下单的全流程解析

本文详细解析了如何从API申请到领券下单,手把手教你接入京东购物小程序的全流程。涵盖京东联盟账号注册、商品信息获取、优惠券链接转换等关键技术实践,帮助开发者高效实现电商功能集成,提升用户购物体验。

g5h6i的博客 907

【23种设计模式】解密Java中介者模式:代码实例带你深入理解

中介者模式是一种设计模式,它允许我们通过引入一个中介对象来简化复杂对象之间的通信。这种模式通过将对象间的直接通信转化为通过中介者进行间接通信,从而降低了系统的耦合度。中介者模式定义了一个中介对象,用于封装一组对象之间的交互。这些对象称为同事(Colleague)对象。中介者(Mediator):定义了一个接口,用于与各同事对象通信。具体中介者(Concrete Mediator):实现了中介者接口,协调各同事对象,了解并维护这些对象。同事类(Colleague)

实践是检验真理的唯一标准 931

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 241

YOLOv11改进 - 卷积Conv | PConv(Pinwheel-shaped Conv): 风车状卷积用于红外小目标检测 | AAAI 2025

本文介绍了风车状卷积(PConv)和基于尺度的动态(SD)损失在YOLOv11中的结合应用。PConv采用不对称填充,通过特殊结构设计、卷积运算和分组卷积技术,能更好地适应红外小目标的像素高斯空间分布,在少量增加参数的情况下极大扩展感受野。SD损失可根据目标大小动态调整尺度和位置损失的影响。我们将PConv集成到YOLOv11的主干网络低层,并在相关配置文件中进行设置。实验证明,YOLOv11 - PConv在IRSTD - 1K和SIRST - UAVB数据集上取得显著性能提升,验证了方法的有效性和泛化能

魔改工程师的博客 1333

Java设计模式之行为型:中介者模式

中介者模式通过中介者对象来封装一系列的对象交互,将对象间复杂的关系网状结构变成结构简单的以中介者为核心的星形结构,对象间一对多的关联转变为一对一的关联,简化对象间的关系,便于理解;各个对象之间的关系被解耦,每个对象不再和它关联的对象直接发生相互作用,而是通过中介者对象来与关联的对象进行通讯,使得对象可以相对独立地使用,提高了对象的可复用和系统的可扩展性。在中介者模式中,中介者类处于核心地位,它封装了系统中所有对象类之间的关系,除了简化对象间的关系,还可以对对象间的交互进行进一步的控制。

张维鹏的博客 1万+

【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读

AUTOSARAutomotive Open System Architecture,汽车开放系统架构,由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立,致力于制定汽车电子软件标准的联盟。网络管理网络管理的目的是使网络中的ECU节点有序的睡眠和唤醒。在没有通信需求的时候睡眠,在需要通信的时候唤醒,可以节约汽车电池的电量。

测试领域技术分享 5162

java模块之间的调用_java 设计模式 中介者模式 让互相调用的模块之间解耦合

java 设计模式 中介者模式 让互相调用的模块之间解耦合java 设计模式 中介者模式 让互相调用的模块之间解耦合用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的角色和职责1、Mediator:中介者类的抽象父类抽象中介者角色定义统一的接口,用于各角色(男和女)之间的通信。2、ConcreteMediato...

weixin_33459498的博客 1122

8、干式变压器

干式变压器的发展,是人类不断挑战材料科学和热物理极限的过程,每一次技术突破,都是在。温度升高,ε_r反而下降(因为分子活动性增强,极化响应变慢)。:固体导热的热阻比液体对流大一个数量级,这是无法逾越的物理规律。Nomex在高温下不是逐渐分解,而是保持性能直到一个临界点。如果 T_a = 40°C,则 T_c = 146.7°C。干式变压器(固体介质分隔):热场、电场、流场(空气)形成三维氢键网络,即使在高温下也能保持机械强度。:不是在现有技术上修修补补,而是寻找新的。仍在H级绝缘允许范围内(≤180°C)

renpeng2692873032的博客 228

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

设计模式(18)——中介者模式

目录智能家庭项目传统方案解决智能家庭管理问题中介者模式中介者模式应用实例-智能家庭管理中介者模式的注意事项和细节 智能家庭项目 智能家庭项目 智能家庭包括各种设备、闹钟、咖啡机、电视机、窗帘 等 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起 -> 咖啡机开始做咖啡 -> 窗帘自动落下 -> 电视机开始播放 传统方案解决智能家庭管理...

minge0001的博客 605

【人工智能】在 cc-switch 中配置 AnyRouter 接入 Claude Code 完整指南

本文介绍了在cc-switch工具中配置AnyRouter中转服务以接入Claude Code的详细步骤。主要内容包括:1) 准备API令牌和端点地址;2) 填写基础信息和模型参数;3) 保存配置并重启终端生效;4) 常见问题排查方法。重点强调了API地址格式、模型ID准确性以及配置写入的必要性,帮助用户顺利完成中转服务配置,实现Claude 4.5版本的正常使用。

奶爸的编程之路,也就一周冷个三天 3102

java学习视频 java常用23种设计模式

java学习视频主要详细讲解java常用23种设计模式,此套java教程为百度网盘下载! 我曾经花了1万多报过java培训班.可能太过愚钝,感觉白学了。这套java学习视频讲的很好,我培训过,虽说学的很差,但是耳濡目染也算有点基础,写作业的时候没什么思路,但是参考了别人的思路,自己也能写完,写完作业感觉很有成就感。祝大家学有所成!   java学习视频介绍   java常用23...

fengliaoai的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java进阶 23种设计模式 详解+应用+实例代码

文章目录前言一、单例模式1.概念2.单例模式应用(1) 懒汉式 基础版(2) 懒汉式 双重校验锁版(3) 饿汉式 单例模式(4)登记式 单例模式 前言 Java的 23种设计模式 创建型模式,共五种(1-5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种(6-12):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种(13-23):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式

Jiang_bug的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)

什么是设计模式:【每天一个java设计模式(零)】 - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:【每天一个java设计模式(一)】 - 工厂模式 抽象工厂模式: 【每天一个java设计模式(二)】 - 抽象工厂模式 单例模式:【每天一个java设计模式(三)】 - 单例模式 原型模式:【每天一个java设计模式(四)】 - 原型模式 建造者模式: 【每天一个java设计模式(五)】 - 建造者模式 结构型模型 适配器模式 : 【每天一个java设计模式(六)】 - 适配器模式 代理模.

1+1=王的博客 6900

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

关于Java中的23种设计模式简介(超详细)

23种设计模式 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基

liubs_的博客 3022

JAVA设计模式(十六)——中介者模式

1、中介者模式         Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种。         Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。中介者模式的核心思想就是两个对象尽可能不要直接相关,而是通过中介者联系。

ljtyzhr的专栏 697

【软件工程】详解23种设计模式原理java实现

设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。23中设计模式的关系定义一个用户创建对象的接口,但由子类决定实例化哪个类。提供一个创建相关或依赖接口的接口,而无需指定具体类。确保一个类只有一个实例,并提供对该例的全局访问点。将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

杰西笔记 1121

Java 之 23 种设计模式解析(来源于尚硅谷)

题目: Java 之 23 种设计模式解析 一、设计模式概述 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式, 共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式, 共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访

戈多 3111

java23种设计模式个人整理_GoF设计模式合集

1 概述 这篇文章是对GoF23种设计模式+1种非GoF模式的合集,由笔者自己的笔记整理而来,每个模式都详细描述了步骤,角色等,以及使用Java实现的具体的例子,下面是目录:基础设计模式概述UML基础创建型模式单例模式简单工厂模式(非GoF模式)工厂方法模式抽象工厂模式原型模式建造者模式结构型模式适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式行为型模式职责链模式命令模式解释器模式迭代器...

weixin_39669133的博客 105

设计模式篇—常用设计模式—23种设计模式简介

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。最新整理面试题上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题最新整理电子书最新整理大厂面试文档以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!外链图片转存中…(img-P4ulKtlu-1712993134654)]

D1561691的博客 878

十六、设计模式之中介者模式【Mediator 】

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

寓教于乐。教己助人 144

java 23中设计模式

Java总共有23中常见的设计模式。它们主要可以分为3类,创建型,结构型以及行为型。  创建型的设计模式有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个唯一的全局访问点。 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或者互相依赖的对象的接口,而无需指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,F...

葛大胖的博客 172

JAVA六大设计原则 和 23种设计模式

相关书籍:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》 JAVA六大设计原则 JAVA设计模式提供六个基本原则,分别是: 开闭原则(OCP) - The Open-Closed Principle 单一职责原则(SRP) - Single Responsibility Principle 里氏替换原则(LSP) - Lisko...

许浑的博客 1823

Java的23种设计模式

一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点      二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。      三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。

shirenfeigui的专栏 1401
上一篇: java23种设计模式(十五) -- 迭代器模式(行为设计模式)
下一篇: java23种设计模式(十七) -- 备忘录模式(行为设计模式)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值