设计模式之中介模式

文章目录

  • 一、介绍
  • 二、生活中的中介模式
  • 三、中介模式中的角色
  • 四、案例演示
    • 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.hqwc.cn/news/151748.html

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

相关文章

2023全新TwoNav开源网址导航系统源码 | 去授权版

2023全新TwoNav开源网址导航系统源码 已过授权 所有功能可用 测试环境&#xff1a;NginxPHP7.4MySQL5.6 一款开源的书签导航管理程序&#xff0c;界面简洁&#xff0c;安装简单&#xff0c;使用方便&#xff0c;基础功能免费。 TwoNav可帮助你将浏览器书签集中式管理&#x…

LeetCode:1465. 切割后面积最大的蛋糕(C++)

目录 1465. 切割后面积最大的蛋糕 题目描述&#xff1a; 实现代码与解析&#xff1a; 贪心 原理思路&#xff1a; 1465. 切割后面积最大的蛋糕 题目描述&#xff1a; 矩形蛋糕的高度为 h 且宽度为 w&#xff0c;给你两个整数数组 horizontalCuts 和 verticalCuts&#xff…

基于机器视觉的行人口罩佩戴检测 计算机竞赛

简介 2020新冠爆发以来&#xff0c;疫情牵动着全国人民的心&#xff0c;一线医护工作者在最前线抗击疫情的同时&#xff0c;我们也可以看到很多科技行业和人工智能领域的从业者&#xff0c;也在贡献着他们的力量。近些天来&#xff0c;旷视、商汤、海康、百度都多家科技公司研…

安装使用vcpkg的简易教程

目录 1. 首先安装vcpkg2. 在vcpkg目录下运行bootstrap-vcpkg.bat 命令3. 接着vs进行集成4. 使用vcpkg搜索可用的包5.下载安装所需包6.下载安装完成 1. 首先安装vcpkg 使用git命令下载 git clone https://github.com/Microsoft/vcpkg.git如果下载失败可直接下载文件 (vcpkg-ma…

计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理

一、简述 激光雷达是目前正在改变世界的传感器。它集成在自动驾驶汽车、自主无人机、机器人、卫星、火箭等中。该传感器使用激光束了解世界,并测量激光击中目标返回所需的时间,输出是点云信息,利用这些信息,我们可以从3D点云中查找障碍物。 从自动驾驶汽车的角度看激光雷达…

【Java】电子病历编辑器源码(云端SaaS服务)

电子病历编辑器极具灵活性&#xff0c;它既可嵌入到医院HIS系统中&#xff0c;作为内置编辑工具供多个模块使用&#xff0c;也可以独立拿出来&#xff0c;与第三方业务厂商展开合作&#xff0c;为他们提供病历书写功能&#xff0c;充分发挥编辑器的功能。 电子病历基于云端SaaS…

8、电路综合-基于简化实频的SRFT微带线的带通滤波器设计

8、电路综合-基于简化实频的SRFT微带线的带通滤波器设计 此处介绍微带线综合的巴特沃斯带通滤波器和切比雪夫带通滤波器的设计方法。对于理查德域的网络综合技术而言&#xff0c;这种带通综合和低通综合在本质上并无区别&#xff0c;因为理查德域函数是周期的。低通滤波器的SR…

Python中的*args 和 **kwargs

在Python中的代码中经常会见到这两个词 args 和 kwargs&#xff0c;前面通常还会加上一个或者两个星号。其实这只是编程人员约定的变量名字&#xff0c;args 是 arguments 的缩写&#xff0c;表示位置参数&#xff1b;kwargs 是 keyword arguments 的缩写&#xff0c;表示关键字…

Jmeter的接口自动化测试

在去年实施了一年的三端&#xff08;PC、无线M站、无线APP【Android、IOS】&#xff09;后&#xff0c;今年7月份开始&#xff0c;我们开始进行接口自动化的实施&#xff0c;目前已完成了整个框架的搭建以及接口的持续测试集成。今天做个简单的分享。 在开始自动化投入前&#…

JS加密/解密之逻辑运算符加密进阶篇

前言 ​ 前篇给大家介绍了运算符不为人知的基础知识。他们的各种表达形式&#xff0c;今天我们从这个基础上&#xff0c;继续进一步告诉大家&#xff0c;如何对字符串进行加密处理。还是那句话&#xff0c;技术人不废话&#xff0c;直接晒代码。 示例源代码 // 字符串加密示…

数据可视化报表分享:区域管理驾驶舱

在零售数据分析中&#xff0c;区域管理驾驶舱报表是用来分析企业运营数据&#xff0c;以制定销售策略和提高利润。因此这张报表需要整合大量数据&#xff0c;数据整合、分析、指标计算的工作量极大&#xff0c;在讲究高效率、高度及时性的大数据时代&#xff0c;BI数据可视化分…

kibana监控

采取方式 Elastic Agent &#xff1a;更完善的功能 Metricbeat&#xff1a;轻量级指标收集&#xff08;采用&#xff09; 传统收集方法&#xff1a;使用内部导出器收集指标&#xff0c;已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…