中介者模式(行为型)

目录

一、前言

二、中介者模式

三、总结


一、前言

        中介者模式(Mediator Pattern)是一种行为型设计模式,又成为调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。

        中介者模式由以下角色组成:

Mediator(中介者):

定义一个接口,用于与各同事对象进行通信。这个接口主要用来协调各同事对象之间的交互

Concrete Mediator(具体中介者):

实现中介者接口,并协调各同事对象之间的交互。具体中介者通常会持有对所有同事对象的引用,并在这些对象之间进行调度和通信

Colleague(同事):

定义一个与中介者进行通信的接口。同事对象知道中介者对象,并且所有的交互都通过中介者来进行

Concrete Colleague(具体同事):

实现同事接口,具体同事通过中介者与其他同事对象进行交互,而不是直接与其他同事对象通信

        整个中介者模式的结构图:

二、中介者模式

        首先编写中介者抽象类Mediator.class:

public abstract class Mediator {public abstract void add(Colleague colleague);public abstract void operation(Colleague colleague, String message);}

        编写具体的中介者类ConcreteMediator.class:

public class ConcreteMediator extends Mediator{private List<Colleague> colleagues = new ArrayList<>();@Overridepublic void add(Colleague colleague) {if (!colleagues.contains(colleague)) {colleagues.add(colleague);colleague.setMediator(this);}}@Overridepublic void operation(Colleague colleague, String message) {for (Colleague coll : colleagues) {if (!coll.equals(colleague)) {coll.receive(message);}}}
}

        编写抽象同事类Colleague.class:

public abstract class Colleague {protected Mediator mediator;public void setMediator(Mediator mediator) {this.mediator = mediator;}public abstract void receive(String message);public abstract void send(String message);
}

        编写具体的同事类ConcreteColleagueOne.class、ConcreteColleagueTwo.class:

public class ConcreteColleagueOne extends Colleague{@Overridepublic void receive(String message) {System.out.println("具体同事类 ConcreteColleagueOne 接收请求:" + message);}@Overridepublic void send(String message) {System.out.println("具体同事类 ConcreteColleagueOne 发送请求:" + message);mediator.operation(this, message);}
}public class ConcreteColleagueTwo extends Colleague{@Overridepublic void receive(String message) {System.out.println("具体同事类 ConcreteColleagueTwo 接收请求:" + message);}@Overridepublic void send(String message) {System.out.println("具体同事类 ConcreteColleagueTwo 发送请求:" + message);mediator.operation(this, message);}
}

        编写客户端类Client.class: 

public class Client {public static void main(String[] args) {Mediator concreteMediator = new ConcreteMediator();Colleague concreteColleague1 = new ConcreteColleagueOne();Colleague concreteColleague2 = new ConcreteColleagueTwo();concreteMediator.add(concreteColleague1);concreteMediator.add(concreteColleague2);concreteColleague1.send("Hello1");concreteColleague2.send("Hello2");}
}

        通过代码可以看出,抽象同事类中拥有抽象中介者类,每个具体的同事类中会调用抽象中介类的方法,由具体的中介者实现。

        代码测试结果:

三、总结

        优点与缺点

优点:

降低耦合性:

通过引入中介者对象,同事对象不再需要显式地引用彼此。它们只需要与中介者对象通信,从而降低了对象之间的耦合度,使得代码更易于维护和扩展

集中控制:

中介者模式将对象之间的交互逻辑集中到一个中介者对象中,简化了对象的管理和协调,便于修改和扩展交互逻辑。

提高可读性和可维护性:

将复杂的对象交互逻辑从对象本身中提取出来放到中介者中,使得每个对象的职责更加单一,代码更清晰,更易于理解和维护。

灵活性和扩展性:

通过改变或扩展中介者对象,可以很方便地改变或扩展系统的交互行为,而不需要修改各个同事对象

缺点:

复杂性增加:

引入了一个新的中介者对象,增加了系统的复杂性。中介者对象本身可能会变得复杂,因为它需要处理所有的交互逻辑

可能导致性能问题:

如果中介者对象处理了大量的交互逻辑,可能会成为性能瓶颈,因为所有的交互都需要通过中介者来处理。

难以维护:

随着系统的规模扩大,中介者对象的逻辑可能变得过于复杂,难以维护。中介者本身可能会变成一个“上帝对象”,负责太多的职责。

        应用场景

GUI框架:

在图形用户界面(GUI)中,中介者模式常用于处理各个组件(如按钮、文本框、复选框等)之间的交互。例如,一个表单中多个输入字段之间的相互启用/禁用状态的管理

聊天室应用:

在即时通讯应用中,中介者模式可以用来处理用户之间的消息传递。聊天室服务器可以作为中介者,负责接收消息并分发给其他用户

航空交通管制:

航空交通管制员作为中介者,负责协调不同飞机之间的通信和导航,确保它们安全地在空域中飞行

模块化系统:

在模块化软件系统中,不同模块之间的通信可以通过中介者模式来实现,从而使得各个模块可以独立开发和维护

工作流引擎:

在业务流程管理(BPM)系统中,中介者模式可以用于协调不同步骤和任务之间的交互,确保按照预定的流程顺序执行

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

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

相关文章

JavaScript基础(十三)

Math对象 方法&#xff0b;说明 ceil() 对数进行上舍入 例&#xff1a;Math.ceil(12.5)返回13&#xff1b; Math.ceil(-12.5)返回-12 &#xff08;简单点来记就是ceil返回的值要比传入的大&#xff09; var…

CP Process2

CP Process2 信贷流程&#xff0c;概念&#xff0c;分类&#xff0c;五级十二类

docker镜像命令容器命令

docker镜像命令 1、docker images //查看所有本地的主机上的镜像 2、docker search mysql //搜素镜像 2、docker pull mysql:5.7 //指定版本拉取mysql镜像 3、docker pull mysql //不指定版本拉取mysql镜像 4、docker rmi -f 镜像id //删除指定镜像 5、4、docker rmi -f 镜像…

基于高德地图实现Android定位功能实现(二)

基于高德地图实现Android定位功能实现&#xff08;二&#xff09; 在实现的高德地图的基本显示后&#xff0c;我们需要不断完善地图的功能 地图界面设计&#xff08;悬浮按钮等&#xff09; 首先就是地图页面的布局&#xff0c;这个根据大家的实际需求进行设计即可&#xff…

前后端数据交互设计到的跨域问题

前后端分离项目的跨域问题及解决办法 一、跨域简述 1、问题描述 这里前端vue项目的端口号为9000&#xff0c;后端springboot项目的端口号为8080 2、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url被请求页面url是否…

cuda缓存示意图

一、定义 cuda 缓存示意图gpu 架构示意图gpu 内存访问示意图 二、实现 cuda 缓存示意图 DRAM: 通常指的是GPU的显存&#xff0c;位于GPU芯片外部&#xff0c;通过某种接口&#xff08;如PCIE&#xff09;与GPU芯片相连。它是GPU访问的主要数据存储区域&#xff0c;用于存储大…

使用dnscat2 进行dns隧道反弹shell——直连模式linux对windows

直连模式&#xff1a;客户端直接向指定IP地址的DNS服务器发起DNS解析请求 环境搭建 搭建服务端 git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server/ gem install bundler apt-get install ruby-dev bundle install 过程会有点慢 开启服务端 ruby ./dn…

二叉搜索树的实现[C++]

文章目录 搜索二叉树概念二叉搜索树的功能查找 实现搜索二叉树节点的定义建立搜索二叉树接口插入搜索打印删除 总结 今天本堂主来一起讨论下什么是搜索二叉树&#xff0c;和如何实现二叉搜索树 搜索二叉树 那么二叉搜索树似乎如何实现搜索呢&#xff1f;二叉搜索树和普通二叉…

linux 之时间子系统(八):hrtime 的实现机制

一、hrtimer 概述 在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足&#xff0c;最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高&#xff0c;定时器层的分辨率只能达到Tick级别&#xff0c;按照内核配置选项的不同&#xff0c;在100Hz到10…

数据库管理1

数据库管理 数据库运维。 sql语句 数据库用来增删改查的语句 备份 数据库的数据进行备份 主从复制&#xff0c;读写分离&#xff0c;高可用。 数据库的概念和相关的语法和规范&#xff1a; 数据库&#xff1a;组织&#xff0c;存储&#xff0c;管理数据的仓库。 数据库的管理系…

一篇文章让你掌握计算网络的HTTP协议!!

HTTP 浏览器的服务原理http协议webTCP/IP协议族TCP/IP协议族分层应用层传输层网络层链路层数据包的封装过程HTTP数据传输过程传输层——TCP三次握手第一次握手第二次握手第三次握手三次握手的目的DNS域名解析HTTP完整事务处理过程HTTP协议的特点支持客户/服务器模式简短快速灵活…

钡铼Modbus TCP耦合器BL200实现现场设备与SCADA无缝对接

前言 深圳钡铼技术推出的Modbus TCP耦合器为SCADA系统与现场设备之间的连接提供了强大而灵活的解决方案&#xff0c;它不仅简化了设备接入的过程&#xff0c;还提升了数据传输的效率和可靠性&#xff0c;是工业自动化项目中不可或缺的关键设备。本文将从Modbus TC、SCADA的简要…

Apache网页优化(企业网站结构部署与优化)

本章结构 一、Apache网页优化 在使用 Apache 作为 Web 服务器的过程中&#xff0c;只有对 Apache 服务器进行适当的优化配置&#xff0c;才能让 Apache 发挥出更好的性能。反过来说&#xff0c;如果 Apache 的配置非常糟糕&#xff0c;Apache可能无法正常为我们服务。因此&…

Java8的新特性

Java8的新特性 一、函数式接口1、Java内置的函数式接口 二、Lambda表达式1、Lambda作用2、语法3、Lambda表达式的六种使用3.1、抽象方法&#xff1a;无参、无返回值3.2、抽象方法&#xff1a;需要传一个参数、无返回值3.3、抽象方法&#xff1a;需要传一个参数&#xff08;类型…

【iOS】OC类与对象的本质分析

目录 前言clang常用命令对象本质探索属性的本质对象的内存大小isa 指针探究 前言 OC 代码的底层实现都是 C/C代码&#xff0c;OC 的对象都是基于 C/C 的数据结构实现的&#xff0c;实际 OC 对象的本质就是结构体&#xff0c;那到底是一个怎样的结构体呢&#xff1f; clang常用…

IDEA实现SpringBoot项目的自打包自发布自部署

目录 前言 正文 操作背景 自发布 自部署 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach…

qt 创建一个左侧边线拖拽的矩形

1.概要 2.代码 2.1 代码第一版 在Qt中&#xff0c;要创建一个可以向左侧拖拽边线的矩形&#xff0c;你需要自定义一个QGraphicsRectItem的子类&#xff0c;并重写其事件处理函数来响应鼠标的拖拽动作。以下是一个简单的实现示例&#xff1a; #include <QApplication>…

设计模式——装饰者模式

设计模式——装饰者模式 1.问题1.1 方案一1.2 方案二 2.装饰者模式2.1 基本介绍2.2 结构2.3 代码实现 3.小结 1.问题 咖啡订单项目&#xff1a; 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)调料:Milk、Soy(豆浆)、Chocolat…

GB35114控制信令认证流程

GB35114控制信令认证说明&#xff1a; 注册成功后,信令发送方与信令接收方进行交互时,采用基于带密钥的杂凑方式保障信令来源安 全&#xff61;对除REGISTER消息以外的消息做带密钥的杂凑&#xff61;启用Date字段,扩展信令消息头域,在头域中 增加 Note 字 段 (值 为 Digest…