设计模式之中介模式

文章目录

  • 一、介绍
  • 二、生活中的中介模式
  • 三、中介模式中的角色
  • 四、案例演示
    • 1. 角色分析
  • 五、优缺点

一、介绍

中介模式(Mediator Pattern),属于行为型设计模式。目的是把系统中对象之间的调用关系从一对多转变成一对一的调用关系,以此来降低多个对象和类之间的通信复杂性。

在很多情况下,一个类中对象于对象之间的调用往往很容易形成网状结构,此时倘若一个对象发生改变,那么将会导致其他所有与之关联的对象进行修改,从而导致系统复杂性增加,且难以维护。

使用中介模式,可以通过向系统中引入中介类,将这种网状结构改为星型结构,各个对象直接不直接关联而是通过该中介类进行交互,当一个对象发生改变时,只需要在中介类中做出相应的修改即可,其他对象对此变化是无感的。

用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

使用下面图示可能会更好的进行表达

在这里插入图片描述

二、生活中的中介模式

在我们日常生活中,处处存在中介模式的影子。

  • 房产中介

    如果没有房产中介,我们需要亲自联系各个房东约其看房,既浪费自己的时间也浪费各个房东的时间;

    有了房产中介,我们只需要联系中介小哥就行了,中介小哥有各个房东的钥匙,直接看房,十分方便。

  • 线上招聘平台

    在没有线上招聘平台的情况下,我们要找一家公司应聘是一件十分麻烦的事情,要么亲自带着简历去公司询问是否招聘某岗位(可能因为不招人而白跑一趟),要么在网上查找各个公司的官网招聘页以邮箱的形式投递简历,但甚至很多小公司都没有官网;

    有了线上招聘平台后,应聘者直接在平台上联系各个公司就好了,通过该平台,应聘者不仅可以看到各种大中小公司,还不会因为公司招聘流程的改变而受影响,因为应聘者在平台上的操作都是一样的。

三、中介模式中的角色

在中介模式中,最重要的角色就是**中介角色(Mediator )**了,它用于在系统中各个对象之间建立关联关系。

  • 抽象中介接口类(Mediator)

    定义中介的功能。

  • 具体中介类(MediatorImpl)

    实现中介接口类定义的功能。在实现的功能逻辑中,给各个对象建立关联关系,因此中介类中需要维护一个包含关联的各个组件的集合并对该集合进行维护。

  • 系统组件抽象接口类(Component)

    定义系统中各个对象的功能。

  • 系统组件具体实现类(AComponentBComponentCComponent)

    实现各个对象的功能。

通过对中介模式中各个角色的分析,可得其通用UM图如下所示

在这里插入图片描述

四、案例演示

群发消息为例,每当我们在重大传统节日时,许多人喜欢使用短信群发的形式,将节日祝福一次性群发给他的亲朋好友们。这是一个非常好的案例,在没有群发功能的时候,我们想好一段祝福语后,需要一个接一个地对通讯录中的朋友进行发送短信(一对多);而后来有了群发功能后,我们选择群发功能,将亲朋好友都添加到这个功能中作为群发联系人,然后点击发送短信就可以将祝福发送给所有人了(一对一)。此时群发功能就相当于中介

1. 角色分析

  • 联系人接口(Friend)

    定义联系人的功能。在节日祝福中,我们通讯录中的联系人有个接收短信功能receiveMessage()就够了。

    public interface Friend {void receiveMessage(String message);
    }
    
  • 具体联系人(FriendImpl)

    实现联系人接口(Friend)定义的功能。假设联系人有三个:父亲、母亲、姐姐。

    public class Father implements Friend{@Overridepublic void receiveMessage(String message) {System.out.println("父亲收到短信:" + message);}
    }public class Mother implements Friend{@Overridepublic void receiveMessage(String message) {System.out.println("母亲收到短信:" + message);}
    }public class Sister implements Friend{@Overridepublic void receiveMessage(String message) {System.out.println("姐姐收到短信:" + message);}
    }
    
  • 抽象群发接口(SendGroup)

    定义一个发送功能send(),以及对群发目标联系人的维护功能addFriend()removeFriend()

    public interface SendGroup {void addFriend(Friend friend);void removeFriend(Friend friend);void send(String message);
    }
    
  • 具体群发中介类(SendGroupImpl)

    实现抽象群发接口SendGroup定义的功能。前面分析中说过,中介类中需要维护一个包含所有联系人的集合并对其进行维护。

    public class SendGroupImpl implements SendGroup{private final List<Friend> friendList = new ArrayList<>();@Overridepublic void addFriend(Friend friend) {if (!friendList.contains(friend)) {friendList.add(friend);}}@Overridepublic void removeFriend(Friend friend) {friendList.remove(friend);}@Overridepublic void send(String message) {for (Friend friend : friendList) {friend.receiveMessage(message);}}
    }
    
  • 客户端(MediatorClient)

    新建一个客户端类对该案例进行演示

    public class MediatorClient {public static void main(String[] args) {Friend father = new Father();Friend mother = new Mother();Friend sister = new Sister();// 选择需要群发短信的联系人SendGroup sendGroup = new SendGroupImpl();sendGroup.addFriend(father);sendGroup.addFriend(mother);sendGroup.addFriend(sister);// 群发短信sendGroup.send("新年快乐");}
    }
    

    运行该代码后得到以下输出

    在这里插入图片描述

五、优缺点

优点:

  • 通过引入中介类,将对象之间的关系从一对多变成了一对一
  • 将各个类进行解耦

缺点:

  • 对客户端的代码维护,转变为对中介类的维护,中介类变得庞大时也将同样难以维护。


纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————

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

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

相关文章

【电路笔记】-电路中的复数与相量(Phasor)

电路中的复数与相量(Phasor) 文章目录 电路中的复数与相量(Phasor)1、概述2、复数定义3、复数计算规则4、电子领域的复数5、总结 复数是一种重要的数学工具&#xff0c;广泛应用于包括电子学在内的许多物理领域。 这个概念可能看起来很奇怪&#xff0c;但它们的操作很简单&…

CDR和AI哪个软件更好用?

设计软件市场中&#xff0c;CorelDRAW和Adobe Illustrator&#xff08;简称AI&#xff09;无疑是两大重量级选手。它们各自拥有庞大的用户群和丰富的功能&#xff0c;但究竟哪一个更好用&#xff1f;本文将从多个角度出发&#xff0c;对这两款软件进行全面而深入的比较&#xf…

Ubuntu下载、安装QGIS软件的方法

本文介绍在Linux操作系统Ubuntu版本中&#xff0c;通过命令行的方式&#xff0c;配置QGIS软件的方法。 在Ubuntu等Linux系统中&#xff0c;可以对空间信息加以可视化的遥感、GIS软件很少&#xff0c;比如ArcGIS下属的ArcMap就没有对应的Linux版本&#xff08;虽然有ArcGIS Serv…

计算机网络之数据链路层(全)

[复习提示] 王道&#xff1a;本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上&#xff0c;重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议&#xff0c;特别是CSMA/CD协议和以太网帧格式&#xff0c;以及局域网的争用期和最…

高级路由配置

目录 路由协议认证 Ripv2的认证配置 OSPF认证 BGP认证 OSPF特殊区域 BGP的选路规则 路由策略&#xff08;route-policy和filter-policy&#xff09; IP-Prefix List:前缀列表 Filter-Policy 路由引入&#xff08;import-route&#xff09; Filter-policy和route-pol…

腾讯云轻量应用服务器怎么样?来自学生的评价

腾讯云轻量应用服务器怎么样&#xff1f;CPU性能如何&#xff1f;我们班同学人手一台&#xff0c;轻量服务器简单高效快速部署&#xff0c;不限制CPU性能&#xff0c;并且费用很低&#xff0c;很适合我们这种群生群体。可以的话&#xff0c;可以推出一些适合学生用户的GPU实例&…

使用 jdbc 技术升级水果库存系统(后端最终版本,不包含前端)

1、配置依赖 <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>junit</groupId><…

【Linux】MAC帧协议 + ARP协议

文章目录 &#x1f4d6; 前言1. 数据链路层2. MAC帧格式3. 再谈局域网4. ARP协议4.1 路由器的转发过程&#xff1a;4.2 ARP协议格式&#xff1a; 5. 如何获得目的MAC地址 &#x1f4d6; 前言 在学完网络层IP协议之后&#xff0c;本章我们将继续向下沉一层&#xff0c;进入到数…

短视频矩阵系统搭建/源头----源码

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#xff…

行业追踪,2023-10-26

自动复盘 2023-10-26 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

ARM | 传感器必要总线IIC

IIC总线介绍 1.谈谈你对IIC总线理解&#xff1f; 1&#xff09;IIC总线是串行半双工同步总线,主要用于连接整体电路 2&#xff09;SCL/SDA作用:IIC是两线制,一根是时钟线SCK,用于控制什么时候进行进行数据传输,时钟信号由主机发出; 另一根是数据线SDA,用于进行数据传输,可以从…

Spring Boot整合OAuth2实现GitHub第三方登录

Spring Boot整合OAuth2&#xff0c;实现GitHub第三方登录 1、第三方登录原理 第三方登录的原理是借助OAuth授权来实现&#xff0c;首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码&#xff0c;然后客户端拿着授权码与授权服务器建立连接获得一个Access Token…

如何将Mysql数据库的表导出并导入到另外的架构

如何将Mysql数据库的表导出并导入到另外的架构 准备一、解决方法1.右键->导出->用mysqldump导出2.注意路径一般为&#xff1a;C:/Program Files/MySQL/MySQL Server 8.0/bin/mysqldump.exe和导出的sql文件位置3.右键->SQL脚本->运行SQL脚本4.找到SQL脚本并点击确定…

软考系统架构师知识点集锦五:系统可靠性分析与设计

一、考情分析 二、考点精讲 2.1相关基本概念 可靠性:可靠性是软件系统在应用或系统错误面前&#xff0c;在意外或错误使用的情况下维持软件系统的功能特性的基本能力。 可用性:可用性是系统能够正常运行的时间比例。 软件可靠性 ≠ 硬件可靠性 软硬件对比 复杂性:软件复杂性比…

canvas基础3 -- 交互

点击交互 使用 isPointInPath(x, y) 判断鼠标点击位置在不在图形内 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

国际腾讯云自主拼装直播 URL教程!!!

注意事项 创建转码模板 并与播放域名进行 绑定 后&#xff0c;转码配置后的直播流&#xff0c;需将播放地址的 StreamName 拼接为 StreamName_转码模板名称&#xff0c;更多详情请参见 播放配置。 前提条件 已注册腾讯云账号&#xff0c;并开通 腾讯云直播服务。 已在 域名…

【golang】Windows环境下Gin框架安装和配置

Windows环境下Gin框架安装和配置 我终于搞定了Gin框架的安装&#xff0c;花了两三个小时&#xff0c;只能说道阻且长&#xff0c;所以写下这篇记录文章 先需要修改一些变量&#xff0c;这就需要打开终端&#xff0c;为了一次奏效&#xff0c;我们直接设置全局的&#xff1a; …

C++继承总结(下)——菱形继承

一.什么是菱形继承 菱形继承是多继承的一种特殊情况&#xff0c;一个类有多个父类&#xff0c;这些父类又有相同的父类或者祖先类&#xff0c;那么该类就会有多份重复的成员&#xff0c;从而造成调用二义性和数据冗余。 class Person {public:Person(){cout << "P…

Unity的live2dgalgame多语言可配置剧情框架

这段代码用于读取表格 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using UnityEngine.Networking; using UnityEngine.UI; using Random UnityEngine.Random;public class Plots…