设计模式之中介者模式

【Java设计模式】Java设计模式之(十)中介者模式(Mediator Pattern) 所有设计模式的代码实现例子都可在码云上查看哦,感兴趣的可以查看哈,码云地址:https://gitee.com/no8g/java-design-patterns 阅读详情

什么是中介者模式

    中介者模式是指用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
    中介者模式主要包含以下几个角色:
        Mediator(抽象中介者):定义了与各同事对象之间进行通信的接口。
        ConcreteMediator(具体中介者):协调各个同事对象来实现协作行为,维持了各个同事对象的引用。
        Colleague(抽象同事类):定义了各个同事类公共的方法,声明了一些抽象方法来供子类实现,同时还维持了一个抽象中介者类的引用,子类可以通过该引用与中介者通信。
        ConcreteColleague(具体同事类):抽象同事类的子类,每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信,在具体同事类中实现了抽象同事类中声明的抽象方法。
    在中介者模式中,中介者类承担了两方面的职责:
        中转作用:通过中介者提供的中转作用,各个同事对象就不再需要显示引用其他同事,当需要和其他同事进行通信时,可通过中介者来实现间接调用。
        协调作用:中介者可以更进一步的对同事之间的关系进行封装,同事可以一致的和中介者进行交互,而不需要指明中介者具体怎么做。

中介者模式的优缺点

优点
  1. 简化了对象之间的交互,用中介者和同事对象的一对多交互代替原来同事之间的多对多交互,一对多关系更容易理解。
  2. 将各同事对象解耦,中介者有利于各同事之间的松耦合,可以方便的增加新的同事类符合开闭原则。
  3. 可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需要生成新的中介者子类。
缺点
  1. 在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

中介者模式的应用场景

  1. 系统中对象之间存在复杂的引用关系,系统结构混乱,难以理解。
  2. 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
  3. 想通过中间类来封装多个类中的行为,又不想生成太多子类。

中介者模式的案例

// 抽象中介者
public abstract class Mediator {

    public abstract void Register(String colleagueName, Colleague colleague);

    public abstract void GetMessage(int stateChange, String colleagueName);

    public abstract void SendMessage();

}

// 具体中介者
public class ConcreteMediator extends Mediator {

    private final HashMap<String, Colleague> colleagueMap;

    private final HashMap<String, String> interMap;

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

    @Override
    public 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. 中介者在这个方法,协调各个具体的同事对象,完成任务
     *
     * @param stateChange   stateChange
     * @param colleagueName colleagueName
     */
    @Override
    public void GetMessage(int stateChange, String colleagueName) {
        //处理闹钟发出的消息
        if (colleagueMap.get(colleagueName) instanceof Alarm) {
            if (stateChange == 0) {
                ((CoffeeMachine) (colleagueMap.get(interMap
                        .get("CoffeeMachine")))).StartCoffee();
                ((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();
            } else if (stateChange == 1) {
                ((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();
            }

        } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {
            ((Curtains) (colleagueMap.get(interMap.get("Curtains"))))
                    .UpCurtains();
        } else if (colleagueMap.get(colleagueName) instanceof TV) {
        } else if (colleagueMap.get(colleagueName) instanceof Curtains) {
        }
    }

    @Override
    public 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);

}

// 具体同事类
public class Alarm extends Colleague {

    public Alarm(Mediator mediator, String name) {
        super(mediator, name);
        //在创建Alarm 同事对象时,将自己放入到ConcreteMediator 对象中[集合]
        mediator.Register(name, this);
    }

    public void SendAlarm(int stateChange) {
        SendMessage(stateChange);
    }

    @Override
    public void SendMessage(int stateChange) {
        //调用的中介者对象的getMessage
        this.GetMediator().GetMessage(stateChange, this.name);
    }

}

public class CoffeeMachine extends Colleague {

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

    @Override
    public void SendMessage(int stateChange) {
        this.GetMediator().GetMessage(stateChange, this.name);
    }

    public void StartCoffee() {
        System.out.println("It's time to startcoffee!");
    }

    public void FinishCoffee() {
        System.out.println("After 5 minutes!");
        System.out.println("Coffee is ok!");
        SendMessage(0);
    }
}


public class Curtains extends Colleague {

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

    @Override
    public void SendMessage(int stateChange) {
        this.GetMediator().GetMessage(stateChange, this.name);
    }

    public void UpCurtains() {
        System.out.println("I am holding Up Curtains!");
    }

}


public class TV extends Colleague {

    public TV(Mediator mediator, String name) {
        super(mediator, name);
        mediator.Register(name, this);
    }

    @Override
    public void SendMessage(int stateChange) {
        this.GetMediator().GetMessage(stateChange, this.name);
    }

    public void StartTv() {
        System.out.println("It's time to StartTv!");
    }

    public void StopTv() {
        System.out.println("StopTv!");
    }

}


public static void main(String[] args) {
    //创建一个中介者对象
    Mediator mediator = new ConcreteMediator();

    //创建Alarm 并且加入到  ConcreteMediator 对象的HashMap
    Alarm alarm = new Alarm(mediator, "alarm");

    //创建了CoffeeMachine 对象,并  且加入到  ConcreteMediator 对象的HashMap
    CoffeeMachine coffeeMachine = new CoffeeMachine(mediator,
            "coffeeMachine");

    //创建 Curtains , 并  且加入到  ConcreteMediator 对象的HashMap
    Curtains curtains = new Curtains(mediator, "curtains");
    TV tV = new TV(mediator, "TV");

    //让闹钟发出消息
    alarm.SendAlarm(0);
    coffeeMachine.FinishCoffee();
    alarm.SendAlarm(1);
}

在这里插入图片描述

【愚公系列】二十三种设计模式(十七)-中介者模式(Mediator Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

相关推荐

芯片低功耗设计实战:CPF与UPF流程选择指南(附工具对比)

本文深入探讨了芯片低功耗设计实战中CPF与UPF流程的选择策略。文章从两者本质差异与演进脉络出发,结合Cadence与Synopsys工具链的深度支持实况,为工程师提供了基于项目场景的决策框架。重点分析了在混合工具链环境下如何实施流程与验证,并强调了利用Spyglass等工具确保功耗意图无损传递的关键技巧,旨在帮助团队做出明智的流程抉择,提升设计效率与可靠性。

weixin_29197051的博客 405

设计模式-中介者模式-Mediator Pattern

在聊天室系统中,用户之间的消息传递通过中介者模式来管理,这样可以避免用户之间的直接通信,简化了用户类之间的耦合,并使得通信策略的修改更加方便。:如果你希望在不同的上下文中重用组件,而这些组件在不同的环境中需要与其他不同的组件交互,中介者模式可以提供一种灵活的方式来适应不同的交互需求。当需要添加新的行为或功能时,可能需要对中介者进行大量的修改,这增加了系统的脆弱性。:如果组件之间的通信逻辑非常复杂,或者经常变化,将这些逻辑集中到中介者中可以简化组件的设计,使得组件不需要了解其他组件的内部实现。

wesigj的博客 1937

Wireshark抓包分析:如何从HTTP流量中快速定位黑客攻击痕迹(附pcap文件)

本文通过Wireshark实战,详细解析了如何从HTTP流量中快速定位黑客攻击痕迹。文章提供了核心过滤策略,并重点剖析了如何识别SQL注入攻击的流量特征、揭露WebShell的隐蔽通信以及追踪攻击者在横向移动中的行为,帮助安全人员系统性地从pcap文件中还原完整攻击链。

sprite的博客 1009

23种设计模式中之中介者模式(Mediator Pattern)

本篇文章将23种设计模式中的迭代器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

自动化学报Ctex+texstudio配置方法

自动化学报Latex的模板win10使用方法(CTEX+texstudio)

zxy15924462502的博客 7371

FastApi教程

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

小石潭记丶 1561

设计模式 20 中介者模式 Mediator Pattern

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过封装对象之间的交互,促进对象之间的解耦合。中介者模式的核心思想是引入一个中介者对象,将系统中对象之间复杂的交互关系集中管理,使得对象之间不直接相互通信,而是通过中介者进行通信,从而降低对象之间的耦合度,提高系统的可维护性和扩展性。在中介者模式中,中介者对象充当了协调者的角色,负责处理系统中各个相互关联对象之间的交互,对于系统其他对象来说,与中介者进行通信是唯一的接口。

jxusthusiwen的专栏 1192

挣脱枷锁:网页禁止复制/F12失效/右键失灵时的破局之道

大家在网上冲浪的否遇到过这种情况?急需网页上的一段关键信息、一段优美的文字、一个重要的代码片段,或者只是想收藏某篇文章,却发现:文本选择被阻止,右键菜单被禁用,开发者工具(F12)被屏蔽,查看源代码(Ctrl+U)失效?本文会有力解决这些封锁。

安德洛夫 2109

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

C++设计模式——中介者模式(Mediator Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——中介者模式(Mediator Pattern)目录引言定义代码示例总结参考资料 引言 假设现在科技发达之后,家里所有设备都是智能化的,而小明在家洗澡的时候有个习惯就是喜欢听歌,而且洗澡时候还要把窗帘拉上。因此就有这种情形,小明要拉窗帘可能就是要洗澡,当然也要听歌,因此我们希望小明家的洗浴设备,音响设备和窗帘设备都能协同合作,不管操作哪种设备,其他两种设备都有一定响应,以此写出程序。

leonardohaig的博客 1891

R语言广义加型模型(GAM)的运用例子及实现教程

一旦拟合了广义加型模型,我们可以查看模型摘要和诊断,以评估模型的质量和拟合情况。# 查看模型摘要响应变量:mpg(汽车的燃油效率)拟合函数:mpg ~ s(hp) + s(wt)

Mrrunsen的博客 3444

uniapp [安卓苹果App端] - 在“安卓app/苹果app“平台端打包编译后,微信授权登录报错 login:fail [:-1]未能完成操作。(PGWXAPI错误-1。)错误码code:-10

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,微信授权登录,uniAppAPP端微信登录报错,出现微信确认登录界面后点击登录报错,BundleID,应用ID,微信登录,app微信一键登录,微信登录绑定点确定就出错,AppSecrect,login:fail[:-1]未能完成操作。(PGWXAPI错误-1。),"errCode":-100,"code":-100,在uniappmanifest.json配置了AppSecrect还是报错无

🏆 前端领域优质创作者 3763

23种设计模式——中介者模式 (Mediator Pattern)详解

本文介绍了23种设计模式之——中介者模式 (Mediator Pattern)的说明及使用

Meteors.的博客 1193

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1512

【C#设计模式】17.中介者模式(Mediator Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断地变化。 在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。 1.2 意图(Intent) 定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。   .....

星Yeah 的博客 2335

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式-15中介者模式Mediator Pattern

中介者模式摘要 中介者模式是一种行为型设计模式,通过引入中介对象来封装一组对象间的复杂交互。该模式降低了对象间的直接耦合,使它们只需与中介者通信,而不必相互引用。中介者模式适用于对象间交互复杂且难以维护的场景,能集中控制交互逻辑并避免产生过多依赖关系。典型实现包含Mediator接口、具体中介者类和同事类结构,其中中介者负责协调同事对象间的通信,同事类则通过中介者发送和接收消息。这种模式广泛应用于聊天室、GUI组件交互等系统设计中。

d3y1`5 81_09 1003

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式(Design pattern)之中介者模式(Mediator Pattern)

摘要:该代码实现了中介者模式,通过中介者(Mediator)协调设备拥有者(Owner)和租赁者(Lessee)之间的通信。中介者抽象类定义核心方法,具体中介类(MediatorReal)维护双方引用并处理消息转发。同事类(Person)作为抽象基类,其子类Owner和Lessee通过中介者进行交互。客户代码演示了租赁场景:租赁者询问设备,拥有者回复报价,所有通信都通过中介者完成。该设计有效解耦了对象间的直接依赖,使系统更易于维护和扩展。

RR1335 之代码才是动力源 223

Statistics and Machine Learning Toolbox

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

设计模式之---中介者模式(Mediator Design Pattern)

场景 买房租房找中介,男女相亲找中介。 用一个中介对象来封装一系列的对象交互。 中介者使各对象不需要显式地相互引用,从而使其韧合松散,而且可以独立地改变它们之间的交互。 简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加人一个‘中介’对象,使得两头的对象分别和‘中介’,对象引用或者依赖。

陌路旧梦 578

设计模式教程:中介者模式(Mediator Pattern)

通过一个中介对象来封装一系列对象之间的交互,使得对象之间不直接互相引用,从而降低耦合度。

遇见伯灵说的博客 1094

设计模式-中介者模式(Mediator Pattern)

设计模式 Java 中介者模式 Mediator

weixin_43438824的博客 693

JAVA设计模式之 中介者模式【Mediator Pattern】

一、概述     用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。 二、适用场景     协调多个对象之间的交互。 三、UML类图 四、参与者 1、Mediator(抽象中介者):它定义一个接口,该接口用于与各同

小吕丶Code阶区 5061

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

中介者模式(Mediator Pattern)是一种对象行为型模式,主要用于降低系统中对象之间的耦合度,通过引入一个中介者来封装对象之间的交互,使得对象之间的交互更加灵活和可扩展。本文将详细介绍中介者模式在C++中的实现方式及其应用场景。

J^T的博客 902

设计模式中的中介者模式(Mediator Pattern)

在软件开发中,多个对象之间可能存在复杂的交互关系,例如GUI 组件之间的通信、聊天系统中的用户交互、航班控制系统等。如果对象之间直接通信,会导致高耦合、难以扩展、难以维护。中介者模式(Mediator Pattern)提供了一种将对象之间的交互封装到一个独立的中介者对象中的方法,使对象之间不直接相互引用,而是通过中介者协调交互,从而降低耦合、提高可维护性。本文将详细介绍中介者模式的概念、应用场景,并通过 Python 代码示例展示其实现方式。

1301

二十三种设计模式——中介者模式(Mediator Pattern)

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

也曾北风温柔以待 284

重温设计模式之中介者模式

中介者模式 Mediator Pattern 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 生活中我们经常会需要中介,比如租房找房产中介要比自己找要方便的多。 再如订外卖,如果没有外卖平台,就要保存很多的外卖菜单,即使这样也会因为消息不及时而错过一些新店开业的优惠。而对餐馆来说,想加几样新菜要么是等别人订餐...

分享知识、分享进步 554

设计模式学习—中介者模式(Mediator Design Pattern)

设计模式之中介者模式,一种行为型模式

闲鱼的博客 376

Java设计模式——中介者模式【Mediator Pattern】

Java设计模式、中介者模式、Mediator Pattern

scorpio的博客 392
上一篇: 设计模式之迭代器模式
下一篇: 设计模式之备忘录模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值