当前位置: 首页 > news >正文

第十九章行为型模式—中介者模式

文章目录

  • 中介者模式
    • 解决的问题
    • 结构
    • 实例
    • 存在的问题
    • 适用场景
  • 中介者模式和代理模式的区别
      • 代理模式
      • 中介模式
      • 桥接模式
      • 总结

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式:

  • 类行为模式:采用继承机制来在类间分派行为

  • 对象行为模式:采用组合或聚合在对象间分配行为

由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。

行为型模式分为:

  • 模板方法模式
  • 策略模式
  • 命令模式
  • 职责链模式
  • 状态模式
  • 观察者模式
  • 中介者模式
  • 迭代器模式
  • 访问者模式
  • 备忘录模式
  • 解释器模式

以上 11 种行为型模式,除了模板方法模式解释器模式是类行为型模式,其他的全部属于对象行为型模式。

中介者模式

中介者模式:又叫调停模式,是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作

解决的问题

image-20230524203453742

  • 我们的飞机想在机场进行降落,但是我们降落场每次只能降落一架飞机,需要飞机之间相互协商,如果我们采用飞行员之间相互沟通,这样的沟通方式是非常危险的,可能会导致飞机相撞事故
  • 但是如果我们引入了空管员这个中介者角色,来协调各个飞机来在这个降落场进行降落,维系各个飞机,而各个飞机不需要直接交互
  • 将网状结构变成了星状结构

结构

  • Mediator:抽象中介者角色,它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

  • ConcreteMediator:具体中介者角色,实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

  • Colleague:抽象同事类角色,定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

  • Concrete Colleague:具体同事类角色,是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

实例

现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。

在这里插入图片描述

抽象中介者角色

public abstract class Mediator {public abstract void trade(String message, Person person);
}

抽象同事类

@Data
@AllArgsConstructor
public abstract class Person {protected String name;protected Mediator mediator;private int type;  //1表示房主 0表示租客private int price; //表示当前期望的金额public void getMessage(String message) {System.out.println( name + "获取到的信息是:" + message);}
}

**具体同事类:**房主、房客

public class HouseOwner extends Person{public HouseOwner(String name, Mediator mediator, int type, int price) {super(name, mediator, type, price);}//和中介进行联系进行交易public void contact(String message){mediator.trade(message,this);}
}
public class Tenant extends Person {public Tenant(String name, Mediator mediator, int type, int price) {super(name, mediator, type, price);}// 和中介联系(沟通)public void contact(String message) {mediator.trade(message,this);}}

具体中介类

public class MediatorStructure extends Mediator{//聚合房主和房客对象private List<Person> persons=new ArrayList<>();//添加客户public void setPersons(Person person) {persons.add(person);}//获取客户public List<Person> getPersons() {return persons;}@Override//为租客匹配合适的房子public void trade(String message, Person customer) {Iterator<Person> iterator = persons.iterator();while (iterator.hasNext()){Person person = iterator.next();if(person.getType()==customer.getType()){continue;}if (customer.getType()==1){//当前顾客表示是房主if (person.getPrice()==customer.getPrice()){//说明价格符合可以进行交易person.getMessage(customer.getName()+message+"你要租住吗");}}else{//说明当前顾客是租客if (person.getPrice()==customer.getPrice()){//说明价格符合可以进行交易person.getMessage(customer.getName()+message+"你要租给他吗");}}}}
}

测试

public class Client {public static void main(String[] args) {// 中介者对象MediatorStructure mediator = new MediatorStructure();// 租房者对象Tenant tenant1 = new Tenant("租房者1",mediator,0,2000);Tenant tenant2 = new Tenant("租房者2",mediator,0,2000);// 房主对象HouseOwner houseOwner1 = new HouseOwner("房东1",mediator, 1,3000);HouseOwner houseOwner2 = new HouseOwner("房东2",mediator, 1,2000);HouseOwner houseOwner3 = new HouseOwner("房东3",mediator, 1,2500);HouseOwner houseOwner4 = new HouseOwner("房东4",mediator, 1,4000);// 中介者要知道具体的房主和租房者mediator.setPersons(tenant1);mediator.setPersons(tenant2);mediator.setPersons(houseOwner1);mediator.setPersons(houseOwner2);mediator.setPersons(houseOwner3);mediator.setPersons(houseOwner4);tenant1.contact("要租2000的房子");}
}

存在的问题

优点

  • 松散耦合

    • 中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样 “牵一处而动全身” 了。
  • 集中控制交互

    • 多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要做修改。
  • 一对多关联转变为一对一的关联

    • 没有使用中介者模式的时候,同事对象之间的关系通常是一对多的,引入中介者对象以后,中介者对象和同事对象的关系通常变成双向的一对一,这会让对象的关系更容易理解和实现。

缺点:

  • 当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护

适用场景

  • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

中介者模式和代理模式的区别

在现实生活中,如房屋中介、买房人、卖房人,房屋中介是一个中介,因为它担任买房人和卖房人之间的相互通讯

房屋中介也是一个代理,它在卖房人眼前是买房人的代理,在卖房人眼前是买房人的代理;

最后房屋中介也是一个桥接,用于连接买房人和卖房人。那这字面意思相似的三者到底有什么不同的应用场景。

代理模式

  1. 最常见的就是数据库中间件,他们代理了数据库的访问,访问一个集群跟访问一个单机数据库一样。
  2. 你想访问 Facebook 或者 Twitter ,如何绕过 GFW?找个代理网站
  3. 生活中有很多实际的案例,比如说“代购”

特点

  1. 一对一,这个代理只能代表一个对象;

  2. 只能代理一方,也就是 PB 是B的代理,A能够通过PB访问B,但是B不能通过PB访问A;

中介模式

1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

2、机场调度系统。

3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

特点

  1. 多对多,这些被管理的对象之间都可以通信,它们的业务关系应该是交织在一起的;

  2. A能够通过中介访问B,B也能够通过中介访问A;

桥接模式

  1. 现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。
  2. 不同电脑可以连接不同的手机
  3. 发送多种类型的消息(qq,email),每种消息都有不同的消息等级(普通消息,紧急消息等)

特点

  1. 一对多的关系,一个类可以有很多其他属性;

  2. 桥接夸大不是对象之间的通信,而是拥有某些属性;

总结

  1. 我们可以看出,中介者模式和代理模式比较相似,他俩夸大的是通信,桥接模式夸大的时候拥有属性;

  2. 中介者模式是多对多通信,代理是一对一通信,桥接是一对多;

  3. 代理是通信只能从一方到另外一方,中介者是双向都可以通信

相关文章:

第十九章行为型模式—中介者模式

文章目录 中介者模式解决的问题结构实例存在的问题适用场景 中介者模式和代理模式的区别代理模式中介模式桥接模式总结 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法…...

AKStream部署1:ZLMediaKit流媒体服务器(win)

环境准备&#xff1a; windows10/11 visual stadio 2022(.net 6) cmake 3.22.0 git bash 没讲究直接下最新的 ffmpeg &#xff1a; ffmpeg-5.1.2-full_build VLC播放器&#xff1a;VLC media player ZLMediaKit&#xff1a;gitee地址 1、安装上述软件 例ffmpeg下载解压至某自定…...

【Redis】Redis 中地理位置功能 Geospatial 了解一下?

文章目录 前言一、Geospatial Indexes 的数据结构二、常用命令三、实用场景示例1. 找出某一经纬度周围的餐馆2. 按照距离排序查询景点 四、在实际开发中&#xff0c;需要注意以下几点&#xff1a; 前言 Geospatial Indexes 是 Redis 提供的一种数据结构&#xff0c;用于存储和…...

Qt Qml 实现键鼠长时间未操作锁屏

文章目录 摘要实现思路键盘鼠标监控百度到的方法我的自己方法 最后 关键字&#xff1a; Qt、 Qml、 QInputEvent 、 QStandardItem、 eventFilter 摘要 今日需求&#xff1a; 项目中需要实时检测用户是否长时间为操作键盘和鼠标&#xff0c;如果超过预设时间未操作键盘和…...

常用的数字高程模型(DEM)数据介绍,附免费下载

常用的数字高程模型&#xff08;DEM&#xff09;数据&#xff1a;​ ETOPO&#xff08;1.8千米&#xff09; ETOPO是一种地形高程数据&#xff0c;由NGDC美国地球物理中心发布&#xff0c;与大多数高程数据不同的是&#xff0c;它还包含海底地形数据。 SRTM15&#xff08;450…...

字节跳动面试挂在2面,复盘后,决定二战.....

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…...

简述熔断、限流、降级

高并发场景指的是在大量用户同时访问服务时&#xff0c;服务能够保持稳定和高效运行的能力。 常用的解决高并发场景下服务不可用问题的技术手段包括熔断、限流和降级&#xff1a; - 熔断&#xff1a;当服务的错误率超过一定阈值时&#xff0c;熔断器会自动断开服务的调用&…...

Maven 工具

Maven 工具 Maven简介Maven 基础概念创建 Maven项目依赖配置生命周期与插件分模块开发聚合和继承聚合继承聚合与继承的区别 属性版本管理多环境配置与应用私服 Maven简介 Maven 本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#xff08;POM…...

iptables扩展匹配条件

文章目录 1. multiport模块2. iprange模块3. string模块4. time模块5. icmp模块6. connlimit模块7. limit模块8.tcp扩展模块9.state模块10 Iptables自定义链1.1 为什么要使用自定义链1.2 创建自定义链1.3 引用自定义链1.4 重命名自定义链1.5 删除自定义链 1. multiport模块 常…...

直播录音时准备一副监听耳机,实现所听即所得,丁一号G800S上手

有些朋友在录视频还有开在线会议的时候&#xff0c;都会遇到一个奇怪的问题&#xff0c;就是自己用麦克风收音的时候&#xff0c;自己的耳机和别人的耳机听到的效果不一样&#xff0c;像是音色、清晰度不好&#xff0c;或者是缺少伴奏以及背景音嘈杂等&#xff0c;这时候我们就…...

回归测试最小化(贪心算法,帕累托支配)

回归测试最小化(贪心算法,帕累托支配) 介绍 有时我们不能只是重新运行我们的测试&#xff08;例如&#xff0c;当我们 换界面&#xff09;。 回归测试可能很昂贵: (1)一些公司通宵运行回归测试套件。 (2) 对于嵌入式系统&#xff0c;我们可能必须测试正在使用的软件&#xff0…...

Python系列模块之标准库shutil详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、shutil介绍 二 、使用详解 2.1 复制函数 2.1.1 shutil.copy 2.1.2 shutil.copy2 2.1.3 shutil.copyfile 2.1.4 shutil.copytree 2.2 移动文件 2.2.1 shutil.move 2.3 删除文件 2.3…...

pb如何播放Flash

---- Flash动画不仅包含动画,还可有声音、超文本连接,同时由于它是矢量格式文件,生成的这种包含动画、声音等的文件(*.swf)很小,非常适 合在网络上传输使用,因而在当前Web网页技术中得到很快发展。本文讨论在PowerBuilder6.5数据库编程中用Flash4提供的控件"Swflas…...

独立成分分析ICA

独立成分分析 ICA 1. 算法原理简介2.源信号与混合信号的差异2.1 独立性 Independence2.2 高斯性 Normality2.3 复杂性 Complexity 3.非高斯性的度量3.1 峭度 Kurtosis 参考文献 blind source separation (BSS) 1. 算法原理简介 mixing得到signal mixture过程&#xff1a; x 1…...

从零开始之如何在React Native中使用导航

好的&#xff0c;让我们开始学习如何在React Native中使用导航。 安装React Navigation 首先&#xff0c;你需要安装React Navigation库。在项目文件夹中打开终端窗口&#xff0c;并运行以下命令&#xff1a; npm install react-navigation/native 或者 yarn add react-nav…...

RAW、RGB 、YUV三种图像格式理解

文章目录 1. 背景2. 相关概念2.1 颜色与色彩空间2.2 RAW图像2.3 RGB图像2.4 YUV图像 3. 分类简图 RAW、RGB 、YUV三种图像格式理解 1. 背景 在工作中&#xff0c;经常听到用来描述图像格式的RAW&#xff0c;RGB与YUV&#xff0c;但一直没有系统的进行了解&#xff0c;处于局部认…...

关于对【mysql存储过程】的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130857854 出自【进步*于辰的博客】 【存储过程】这个知识点&#xff0c;我在大二下期学习【mys…...

贪吃蛇游戏的制作记录

关于蛇的实现代码 #include "snake.h" #include "globalvar.h" #include <graphics.h> int fangXiang 1;//方向 0 右 1 上 2 左 3 下 int snakeHang[100] { 10,11,12,13,14 };//蛇 每节所在行 int snakeLie[100] { 10,10,10,10,10 };//蛇 每节所…...

Go基础入门

Go是一种现代的、高效的、开源的编程语言&#xff0c;由Google开发。它的语法简洁、易于学习和使用&#xff0c;支持并发编程&#xff0c;特别适合构建网络应用和分布式系统。本篇文章将介绍Go语言的基础语法和常用特性&#xff0c;帮助初学者快速入门。 一、Go语言的基础语法…...

JavaScript教程(二)

BOM浏览器对象模型 什么是BOM BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是 window&#xff1b;BOM由一系列相关的对象构成&#xff0c;并且每个对象都提供了很多方…...

为什么92%的医学生用错Claude读文献?——神经内科、肿瘤学、循证护理三大领域TOP10错误清单(含修正对照表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么92%的医学生用错Claude读文献&#xff1f; 医学生普遍将Claude当作“高级PDF阅读器”&#xff0c;直接上传整篇NEJM或Lancet论文PDF并输入“总结一下”&#xff0c;却忽视其对长文本结构化处理的…...

【2026年阿里巴巴集团暑期实习- 5月23日-算法岗-第一题- 荆棘林的最优砍断计划】(题目+思路+JavaC++Python解析+在线测试)

题目内容 林中共有 n n n 株荆棘,第 i i i 株的坚硬度为 a i a_i...

从/dev/snd文件看起:手把手教你理解Linux ALSA声卡驱动的设备命名规则

从/dev/snd文件看起&#xff1a;手把手教你理解Linux ALSA声卡驱动的设备命名规则当你第一次打开/dev/snd目录&#xff0c;看到诸如controlC0、pcmC0D0p这样神秘的文件名时&#xff0c;是否感到困惑&#xff1f;这些看似随意的字符串背后&#xff0c;其实隐藏着ALSA驱动对音频硬…...

10_函数递归_从阶乘到递归调用栈

函数递归&#xff1a;从阶乘到递归调用栈 一、本篇文章要解决什么问题 上一篇学了函数——函数可以调用别的函数。那函数能不能调用自己&#xff1f;能&#xff0c;这就是递归。 递归是 C 语言中非常有特色的一种编程技巧&#xff0c;很多数据结构&#xff08;树、图&#xff0…...

深度学习安全帽佩戴检测系统

1 前言 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;深度学习安全帽佩戴检测系统 项目运行效果&#xff1a; 毕业设计 深度学习安全帽佩戴检测系统&#x1f9ff; 项目分享:见主页简介 1 课题背景 建筑工人头部伤害是造成建筑伤亡事故的重要原因。佩戴安全帽是防止…...

传统FPM项目怎么渐进式迁移到Swoole/Hyperf?

传统 FPM 项目渐进式迁移到 Swoole / Hyperf 完整方案下面是一份实战派迁移指南,不搞理想化"重写",而是一边赚钱一边换引擎。---一、先讲清楚:为啥要迁?要迁到哪?1.1 FPM 的痛点- 每个请求都要重新加载框架(Laravel 启动 30~80ms,Hyperf 启动后 0ms)- 不能保持长连…...

嵌入式C语言开发中的三大致命陷阱

很多人刚开始学习C语言时,会觉得: 会指针 会结构体 会寄存器操作 能驱动外设 似乎就已经掌握了嵌入式开发。 但真正进入项目后才会发现: 嵌入式开发最难的,从来不是语法,而是“代码与硬件现实世界之间的耦合”。 同样一句代码: 在PC上可能只是运行错误; 在单片机里却可…...

量子计算中的SWAP门原理与应用解析

1. 量子计算中的SWAP门基础原理量子计算区别于经典计算的核心在于量子比特&#xff08;qubit&#xff09;的叠加态和纠缠态特性。在量子线路设计中&#xff0c;SWAP门作为基础量子逻辑门之一&#xff0c;扮演着量子信息交换的关键角色。与经典计算中的位交换不同&#xff0c;量…...

【AI入门知识点】Harness 是什么?为什么 DeepSeek 要组建 Harness 团队?

最近&#xff0c;DeepSeek 招聘信息中出现了一个越来越高频的关键词——Harness 团队。 很多人第一反应是&#xff1a; Harness 是什么&#xff1f;一种新模型&#xff1f;还是某个框架&#xff1f;为什么 DeepSeek 专门成立团队来做这个&#xff1f;如果你第一次听到这个词&am…...

通过curl命令直接测试Taotoken聊天补全接口的配置与调用方法

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令直接测试Taotoken聊天补全接口的配置与调用方法 在开发或调试大模型应用时&#xff0c;有时你可能希望绕过高级SDK&am…...