设计模式-18中介者模式

魔兽RPG老地图逆向工程:解密三国列传3.0武将招募限制(附JASS实战) 本文详细解析了《三国列传3.0》魔兽RPG地图的武将招募限制机制,通过逆向工程和JASS脚本修改技术,突破SLK加密防线并解密游戏逻辑。文章提供了从工具准备到代码修改的完整实战指南,帮助玩家解除武将数量限制,重温经典游戏的乐趣。 阅读详情

中介者模式

基本介绍:
  • 中介者模式,用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的关系
  • 中介者模式属于行为型模式,使代码更易于维护
  • 比如MVC模式,controller使Model和View的中介者,在前后端交互时起到了中间人的作用
原理类图:

在这里插入图片描述

角色说明:
  • Mediator 就是抽象中介者,定义了同事对象到中介者对象的接口
  • Colleague 是抽象同事类
  • ConcreteMediator 具体的中介者对象,实现抽象方法,他需要知道所有的具体的同事类,即以一个集合来管理同事类,并接受某个同事类的消息,完成相应的任务
  • ConcreteColleague 具体的同事类,会有很多每个同事类只知道自己的行为,而不了解其他同事类的行为,但他们都依赖中介者对象
案例:
需求:

​ 完成前面的只能家居项目

类图:

在这里插入图片描述

public abstract class Mediator {
    //将中介者对象加入到集合中
    abstract void register(String colleagueName,Colleague colleague);
    //接收消息,具体的同事类发出
    abstract void getMessage(int stateChange,String colleagueName);
    abstract void  sendMessage();
}

public class ConcreteMediator extends Mediator {

    private Map<String,Colleague> colleagueMap;
    private Map<String,String> interMap;

    public ConcreteMediator() {
        this.colleagueMap = new HashMap<>();
        this.interMap = new HashMap<>();
    }

    @Override
    void register(String colleagueName, Colleague colleague) {
        colleagueMap.put(colleagueName,colleague);

        if(colleague instanceof Alarm){
            interMap.put("Alarm",colleagueName);
        }else if(colleague instanceof CoffeeMachine){
            interMap.put("CoffeeMachine",colleagueName);
        }else if(colleague instanceof Tv){
            interMap.put("Tv",colleagueName);
        }else if(colleague instanceof Curtains){
            interMap.put("Curtains",colleagueName);
        }
    }

    /**
     * 具体中介者核心方法
     * 1.根据得到的消息完成对应的任务
     * 2.中介者在这个方法协调各个具体的同事对象完成任务
     */
    @Override
    void getMessage(int stateChange, String colleagueName) {
        if(colleagueMap.get(colleagueName) instanceof Alarm){
            if(stateChange == 0){
                ((CoffeeMachine)colleagueMap.get(interMap.get("CoffeeMachine"))).start();
                ((Tv)colleagueMap.get(interMap.get("Tv"))).start();
            }else if(stateChange == 1){
                ((Tv)colleagueMap.get(interMap.get("Tv"))).stop();
            }
        }else if(colleagueMap.get(colleagueName) instanceof CoffeeMachine){
            ((Curtains)colleagueMap.get(interMap.get("Curtains"))).up();
        } else if(colleagueMap.get(colleagueName) instanceof Tv){
            //空实现
        } else if(colleagueMap.get(colleagueName) instanceof Curtains){

        }
    }

    @Override
    void sendMessage() {

    }
}

/**
 * 抽象类
 */
public abstract class Colleague {
    private Mediator mediator;
    public String name;

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

    public Mediator getMediator(){
        return this.mediator;
    }

    public abstract void sendMessage(int stateChange);
}


/**
 * Created by xys1917 on 2020/3/8.
 * 具体的同事类
 */
public class Alarm extends Colleague {

    public Alarm(Mediator mediator, String name) {
        super(mediator, name);
        mediator.register(name,this);
    }
    public void sendAlarm(int stateChange){
        sendMessage(stateChange);
    }
    @Override
    public void sendMessage(int stateChange) {
        this.getMediator().getMessage(stateChange,this.name);
    }
}

public class Curtains extends Colleague {

    public Curtains(Mediator mediator, String name) {
        super(mediator, name);
        mediator.register(name,this);
    }

    public void up(){
        System.out.println("窗帘升起");
    }

    public void sendCurtains(int stateChange){
        sendMessage(stateChange);
    }

    @Override
    public void sendMessage(int stateChange) {
        getMediator().getMessage(stateChange,name);
    }
}	

public class Tv extends Colleague {

    public Tv(Mediator mediator, String name) {
        super(mediator, name);
        mediator.register(name,this);
    }

    public void start(){
        System.out.println("打开电视");
    }

    public void stop(){
        System.out.println("关闭电视");
    }

    public void sendTv(int stateChange){
        sendMessage(stateChange);
    }

    @Override
    public void sendMessage(int stateChange) {
        getMediator().getMessage(stateChange,name);
    }
}

public class CoffeeMachine extends Colleague {

    public CoffeeMachine(Mediator mediator, String name) {
        super(mediator, name);
        mediator.register(name,this);
    }

    public void start(){
        System.out.println("打开咖啡机");
    }

    public void sendCoffeeMachine(int stateChange){
        sendMessage(stateChange);
    }

    public  void finishCoffee(){
        System.out.println("咖啡制作完毕");
    }

    @Override
    public void sendMessage(int stateChange) {
        getMediator().getMessage(stateChange,name);
    }
}

public class Client {

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

        Alarm alarm = new Alarm(mediator, "alarm");

        CoffeeMachine coffeeMachine = new CoffeeMachine(mediator, "coffeeMachine");

        Curtains curtains = new Curtains(mediator, "curtains");

        Tv tv = new Tv(mediator, "Tv");

        alarm.sendAlarm(0);
        coffeeMachine.finishCoffee();
        alarm.sendAlarm(1);
    }
}
流程说明:
  • 创建ConcreteMediator对象
  • 创建各个具体的同事类,比如:alarm、Tv
  • 创建各个同事对象的时候,就直接通过构造器,加入到ColleagueMap
  • 同事类对象,可以使用sendMessage,最终会调用ConcreteMediator的getMessage方法
  • getMessage会根据接收到的同事对象发出的消息来协调调用其他同事对象完成任务
  • 可以看到getMessage是核心方法,完成相应任务
中介者模式注意事项和细节:
  • 多个类相互耦合,会形成网状结构,使用中介者模式可以将网状结构分离为星型结构,进行解耦
  • 减少类间依赖,降低耦合,符合迪米特原则
  • 中介者承担了较多的责任,一旦中介者出现了问题,整体系统就会收到影响
  • 如果设计不当,中介者对象本身变得过于复杂,这点在时间使用时,需要特别注意
手把手教你安装 Vivado2022.2(附安装包) Vivado 2022.2版本与之前的版本相比,具有以下几个显著的优势:电源设计管理器(PDM):Vivado 2022.2引入了全新的电源设计管理器(PDM),这是一个下一代功耗评估平台,为Versal® 和 Kria™ SOM提供了准确一致的功耗估计能力。PDM是Versal产品家族的首选功耗评估工具,为Versal ACAP硬IP块提供增强向导,简化从XPE向PDM的迁移,帮助用户获得准确的功耗评估。 阅读详情

相关推荐

逆向解析喜马拉雅新版xm-sign算法:从dws.1.6.8.js到签名生成

本文详细解析了喜马拉雅新版xm-sign算法的逆向破解方法。通过定位核心JS文件dws.1.6.8.js,构建本地Node.js模拟执行环境,并解密关键参数cid与appKey,最终实现签名算法的本地化稳定生成,为数据采集提供可靠解决方案。

weixin_29250403的博客 210

C#设计模式(18)——中介者模式(Mediator Pattern)

C#设计模式(18)——中介者模式(Mediator Pattern) 一、引言   在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解。 二、 中介者模式的介绍 2.1 中介者模式的定义   从生活中的例子可以看出,不论是QQ游戏还是...

fgmah2000的博客 284

手把手教学|用飞书+扣子工作流实现自动化批量图片生成,效率提升99%!体验完整操作流程

在先前的文章中,我们已经深入探讨了扣子智能体的多种应用场景,以及如何创建和使用工作流进行高效管理。本文将引领大家通过一个具体案例,将扣子的工作流功能嵌入飞书应用中,实现操作的自动化与高效化。

weixin_66485800的博客 6028

【C#设计模式(18)——中介者模式(Mediator Pattern)】

中介者模式:是两者之间通过第三者来帮助传话。

weixin_43626218的博客 539

MS2107 CVBS转USB2.0 音视频采集芯片,支持1080P@30HZ输出

MS2107 是一款视频和音频采集芯片,支持CVBS转USB2.0 ;可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。

TEL18967112838的博客 2075

Starlink第三代终端与第二代终端的差异分析

SpaceX星链第三代终端实现显著升级,硬件售价维持599美元不变但性能全面提升。相比第二代产品,第三代终端取消自动调节电机改为手动定向,防水防尘等级提升至IP67,天线面积扩大46%,支持235台设备连接(提升87%),下载速度可达1Gbps(提升4倍),延迟降至20ms以下。新增3个千兆接口和WiFi6支持,同时推出199美元单独路由器选项。这些改进使第三代终端在保持价格优势的同时,更好地满足户外、移动和商业场景需求,标志着SpaceX卫星互联网服务从亏损销售转向盈利模式的重要转折。

通信行业老兵、物联网从业者,做一个有趣的普通人。 3028

java 23 种设计模式-18-java 中介者模式(Mediator Pattern)

目录 目录 中介者模式 实际案例 定义 测试 实现方式 UML &amp; Code UML Code 系列导航 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。 中介者模式属于行为型模式。 实际案例 类信息概览: ...

3万+

Transformer实战(38)——视觉Transformer (Vision Transformer, ViT)

Transformer 在自然语言处理 (NLP) 领域取得了显著成就,在许多不同的任务中都表现出色。在本节中,我们将探索视觉 Transformer (Vision Transformer, ViT) 模型。正如 NLP 领域创建了多种模型一样,视觉领域也开发了多种模型,每种模型都为计算机视觉提供了新的视角。通过本节,将学习如何使用 ViT 等模型进行计算机视觉任务,了解基于 Transformer 的预训练计算机视觉模型的工作原理,以及如何针对特定任务进行微调。

盼小辉丶的博客 2813

D18:C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

一、引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是【中介者模式】,英文名称是:Mediator Pattern。还是老套路,先从名字上来看看。“中介者模式”我第一次看到这个名称,我的理解是,在两个对象中间增加一个“中间对象”,“中间对象”协调两个对象的关系,但是随着理解的深入,“中间对象”处理关系的对象可能不只是两个对象,可能是三个对象,或者更多对象。中介者模式在现实生活中的例...

. 439

由浅入深的详细解读汽车PDU与BDU

本文详细解读新能源汽车的PDU高压配电单元和BDU电池包断路单元,涉及电气件参数设计、选型、结构设计、电气安全、散热设计、继电器控制与诊断,提供汽车电子知识和技术解析。

让你爱上电路设计 1万+

【100%通过率】2023华为od机试C卷【电脑病毒感染】Python 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 3032

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

一、引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室、QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解。 二、 中介者模式的介绍 2.1 中介者模式的定义 从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊

Foreach 416

15、运行语音识别应用:从Mac到微控制器的部署指南

本文详细介绍了如何在Mac上运行语音识别应用,并将其部署到Arduino Nano 33 BLE Sense和SparkFun Edge等微控制器设备上的完整流程。内容涵盖应用构建、设备特定的音频与输出实现、部署步骤、常见问题解决方案及进一步优化建议。通过本指南,开发者可快速实现基于TensorFlow Lite的嵌入式语音识别系统,并根据需求进行自定义修改与功能扩展。

l3m4n的博客 57

设计模式18-中介者模式

用一个中介对象来封装(封装变化)一系列的对象交互。终结者使各对象不需要显示的相互引用(编译时依赖变成运行时依赖),从而使其耦合松散也可以独立的改变他们之间的交互。–《设计模式》GOF中介者模式定义了一个中介对象,该对象封装了对象之间的交互方式,使得对象之间不再需要显式地相互引用,从而使其耦合松散,且可以独立地改变它们之间的交互。中介者模式通过引入中介者对象,将对象之间的交互逻辑集中管理,从而降低对象之间的耦合度。

qq_41810539的博客 934

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++设计模式18——中介者模式

https://blog.youkuaiyun.com/CoderAldrich/article/details/83272866 C++设计模式——简单工厂模式 C++设计模式——工厂方法模式 C++设计模式——抽象工厂模式 C++设计模式——单例模式 C++设计模式——建造者模式 C++设计模式——原型模式 C++设计模式——适配器模式 C++设计模式——桥接模式 C++设计模式——组合...

chenyijun的专栏 543

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C#设计模式之18——中介者模式

随着越来越多的类在程序中被开发出来,这些类之间的通信问题变得越来越复杂。每个类需要知道其他类的方法越多,类的结构就容易变得混乱,这使得程序不易于阅读和维护。另外,对程序的修改也变得困难起来,因为任何修改都会影响到其他多个类的代码。中介者模式通过促进这些类之间更加松散的耦合来解决这一问题。中介者实现这样一做法的方式是,成为唯一一个详细了解其他类的方法的类,其他的类在改变发生的时候通知中介者,中介者把

Work Hard, Play Harder! 3745

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

18、设计模式之中介者模式

概述 太长了,看下b站上的黑马视频截图吧 定义 中介者模式又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变他们之间的交互。 结构 抽象中介者角色(Mediator):它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法 具体中介者角色(Concrete Mediator):实现中介者接口,定义一个List来管理同事对象,协调各个角色之间的交互关系,因此它依赖于同事角色。 抽象同事类角色(Colleague):定义同事类的接口,保存中介者对象

pp_hu的博客 161

设计模式第18讲——中介者模式(Mediator)

中介者模式是一种行为型设计模式,它主要用于减少对象之间互相通信的复杂性。一、什么是中介者模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景五、代码实现 5.0 UML类图 5.1抽象中介者(Mediator)——LogisticsCenter5.2抽象同事类(Colleague)——Participant5.3具体同事类(Concrete Colleague)TransportCompany&Merchant5.4具体中介者(Con

让~学习~成为一种习惯(橡 皮 人の技术博客) 3292

设计模式 18 中介者模式

一提到中介,大家都非常熟悉,生活中最常见的就是房屋中介。虽然中介要收取一定费用,但却能给房东和租客都提供大量遍历,房东只需要把房屋信息提供给中介,租客也只需要将租金交给中介,由中介处理中介环节,给两方都提供了便利。这就是中介模式的应用。

天河有尽后为涯,星海无边前作岸。 214

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

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

minge0001的博客 605

18.设计模式——中介者模式

中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 介绍 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。 何

蓝色的天空的博客 1085
上一篇: 设计模式-17观察者模式
下一篇: 设计模式-19备忘录模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值