中介者设计模式(Mediator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、适用场景]

news2024/11/19 15:36:54

文章目录

  • 概念
  • 组成角色
  • 相关图示
  • 示例代码
  • 适用场景

概念

        中介者设计模式是一种行为型设计模式,它通过引入一个中介对象来封装一组对象之间的交互,使得对象之间不需要显式地相互引用,从而降低它们之间的耦合。通过将对象间的通信封装到中介者对象中,可以更容易地对这些对象的交互进行维护和修改。

组成角色

  1. 抽象中介者(Mediator):定义了一个接口,用于与各同事(Colleague)对象之间的通信。
  2. 具体中介者(ConcreteMediator):实现抽象中介者接口,协调各同事对象的交互关系。它需要了解并维护各同事对象。
  3. 抽象同事(Colleague):定义各个同事对象的接口。各同事对象应该知道中介者对象,即可以与中介者对象通信。同事对象与其他同事对象的通信都通过中介者来完成。
  4. 具体同事(ConcreteColleague):实现抽象同事接口,具体的同事对象。每个具体同事对象只需要知道自己与中介者的交互,不需要了解其他同事。

相关图示

在这里插入图片描述

示例代码

// 抽象中介者
interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

// 具体中介者
class ConcreteMediator implements Mediator {
    private ColleagueA colleagueA;
    private ColleagueB colleagueB;

    public void setColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public void setColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }

    @Override
    public void sendMessage(String message, Colleague colleague) {
        if (colleague == colleagueA) {
            colleagueB.receiveMessage(message);
        } else {
            colleagueA.receiveMessage(message);
        }
    }
}

// 抽象同事
abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

// 具体同事A
class ColleagueA extends Colleague {
    public ColleagueA(Mediator mediator) {
        super(mediator);
    }

    public void send(String message) {
        mediator.sendMessage(message, this);
    }

    public void receiveMessage(String message) {
        System.out.println("同事A收到信息:" + message);
    }
}

// 具体同事B
class ColleagueB extends Colleague {
    public ColleagueB(Mediator mediator) {
        super(mediator);
    }

    public void send(String message) {
        mediator.sendMessage(message, this);
    }

    public void receiveMessage(String message) {
        System.out.println("同事B收到信息:" + message);
    }
}

// 客户端代码
public class MediatorDemo {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

        ColleagueA colleagueA = new ColleagueA(mediator);
        ColleagueB colleagueB = new ColleagueB(mediator);

        mediator.setColleagueA(colleagueA);
        mediator.setColleagueB(colleagueB);

        colleagueA.send("你好,同事B!");
        colleagueB.send("你好,同事A!");
    }
}

适用场景

  1. 大量对象交互:在一个系统中,有许多对象需要相互交流和协作。通过引入中介者,可以将复杂的对象关系简化,减少直接依赖。
  2. 易扩展:当需要添加新的对象时,无需修改原有对象之间的交互逻辑,只需在中介者中添加新对象的交互逻辑,降低了维护成本。
  3. 解耦:中介者将对象之间的交互行为封装起来,使得各对象之间的耦合度降低,有利于代码重用和模块化。
  4. 需要改变对象交互方式:当需要改变对象之间的交互方式时,无需修改对象本身,只需修改中介者,这有助于提高系统的灵活性。

以下是一些中介者设计模式可能适用的实际场景:

  1. 聊天室应用:聊天室中的用户通过中介者对象(聊天室服务器)发送和接收消息,而无需直接与其他用户通信。
  2. 交通信号控制系统:多个交通信号灯通过中介者(信号控制器)进行协调,避免直接引用和相互影响。
  3. 用户界面(UI)组件协调:在复杂的用户界面中,多个UI组件之间的交互和状态变化可以通过中介者对象进行统一管理,降低组件之间的耦合程度。
  4. 机场调度系统:通过中介者(调度中心)来协调飞机、跑道、航班等资源的调度,降低各部分之间的依赖。

在多个对象之间需要进行协调、交互或者依赖的场景下,可以考虑使用中介者设计模式。

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

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

相关文章

Ubuntu20.4利用httpd(Apache2)源码搭建web服务器

Apache取自“a patchy server”的读音,源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一,Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。 本来它只用于小型或试验Internet网络…

TinyOS 配置教程

文章目录 前言1. 安装1.1. 实验环境1.2. TinyOS基础工作1.3. TinyOS 的配置1.4. 安装 java1.5. 安装编译器 2. 测试仿真程序总结 前言 本文主要用于记录在 WSN 课程中,配置大作业所需使用的 TinyOS 仿真环境 1. 安装 1.1. 实验环境 本实验以如下版本为例&#xf…

Python面向对象详解(非常详细)

非常详细的讲解(爆肝1w字)👏🏻👏🏻👏🏻 零基础一样学得会👌🏻 干货满满不看后悔👍👍👍 📝个人主页→数据…

函数重载注意事项

C为什么支持函数重载,C语言不支持函数重载? C代码产生函数符号时, 是函数名参数列表类型组成的!如_Z3sumii C代码产生函数符号时,只由函数名决定 什么是函数重载? 一组函数,其中函数名相同&…

读书笔记-《ON JAVA 中文版》-摘要14[第十四章 流式编程]

文章目录 第十四章 流式编程1. 流支持2. 流创建2.1 流创建2.2 随机数流2.3 int 类型的范围2.4 generate()2.5 iterate()2.6 流的建造者模式2.7 Arrays2.8 正则表达式 3. 中间操作3.1 跟踪和调试3.2 流元素排序3.3 移除元素3.4 应用函数到元素3.5 在 map() 中组合流 4. Optional…

电脑文件恢复怎么做?3个方法快速恢复文件!

案例:电脑文件恢复怎么操作? 【我的电脑已经好久没用了,最近因为需要查看一些相关的文件才用到电脑,但是我打开后发现里面很多重要的文件都不见了,请问电脑文件应该怎么恢复呢?感谢回答!】 电…

AIGC从入门到精通

一键起飞 # 提前安装好python 3.10.9 ​git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui cd stable-diffusion-webui ./webui.sh -f --api --listen --enable-insecure-extension-access 非常详细!6000字详解AI绘画文生图干货、技巧&#xf…

【多线程】线程的状态

1. 等待一个线程 join 有一天张三与小美在家里吃饭,张三早早的把饭吃完了,对小美说,等你把饭吃完了,我就去洗碗了! 此时张三就要等待小美吃完饭才能去洗碗,就好比线程 A 要等待线程 B 执行完,线…

Ansys Lumerical | 光子集成电路之PN 耗尽型移相器仿真工作流

01 说明 本文旨在介绍Ansys Lumerical针对有源光子集成电路中PN耗尽型移相器的仿真分析方法。通过FDE和CHARGE求解器模拟并计算移相器的性能指标(如电容、有效折射率扰动和损耗等),并创建用于INTERCONNECT的紧凑模型,然后将其表征…

vue_03

文章目录 导航菜单功能的实现在Admin.vue中添加下列代码布局选择点击跳转事件 vuex的安装及配置安装配置新建store和index.js在index.js下写如下代码在main.js中引入store 封装菜单请求工具类新建menus.js编写menus.js文件 解决F5刷新数据丢失问题 导航菜单功能的实现 在Admin…

多项开发任务,如何做好任务分配和管理?

1、确定任务清单 任务精细化分解 需要将任务进行精细化分解,每个子任务时间最好不超过一周,明确子任务的目标、时间点和交付物。 多项开发任务,如何做好任务分配和管理? 2、优先级排序 需要将精细化好的任务,进行优先级…

TFTP+Filezilla文件双向传输(2)-ubuntu(VMware)-win10(host)

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。 ftpd-hpa是tftp服务器 tftp-hpa是tftp客服端 inetd的全称…

设计尝试用Microsoft Visual Studio 在网络上架构一个电影院网络订票系统

设计尝试用Microsoft Visual Studio 在网络上架构一个电影院网络订票系统的设计,以使每一位客户不用出门就能看到最新的电影信息和预定电影票。本文从理论和实践两个角度出发,对一个具有数据挖掘功能电影院网络订票系统的设计进行设计与实现分析。随着电…

windows下运行dpdk下的helloworld

打开“本地安全策略”管理单元,在搜索框输入secpol。 打开本地策略->用户权限分配->锁定内存页->添加用户或组->高级->立即查找 输入电脑用户名,选择并添加。点击确定后,重启电脑。 安装内核驱动,下载地址https:…

srm 采购管理系统是如何赋能企业降本的?

近年来,随着全球经济的不断发展,企业的竞争也日趋激烈,企业为适应市场需求,加强产品创新和技术升级,加大产品研发和生产投入,然而在新冠肺炎疫情的影响下,许多企业经营出现困境。在这种情况下&a…

基于时间戳和序列号的mac地址生成策略

基于时间戳 基于时间戳生成MAC地址的具体操作步骤如下: 获取设备的出厂日期和时间。一般情况下,这个信息可以在设备的测试报告或者出厂记录中找到。 将设备的出厂日期和时间转换成时间戳格式。时间戳指的是一个从1970年1月1日00:00:00 UTC开始的秒数。…

自动化数据驱动?最全接口自动化测试yaml数据驱动实战,看这一篇就够了

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 我们在做自动化测…

ROS学习第十九节——TF静态坐标变换

1.坐标msg消息 订阅发布模型中数据载体 msg 是一个重要实现,首先需要了解一下,在坐标转换实现中常用的 msg:geometry_msgs/TransformStamped和geometry_msgs/PointStamped 前者用于传输坐标系相关位置信息,后者用于传输某个坐标系内坐标点的…

js面试题

在全局作用域下声明了一个变量 arr, 它的初始值是一个空数组 第二段代码,循环计数器变量i的初始值为0,循环条件是i的值小于2, 也就是说当i的值为0或者1时, 循环条件才能成立 才能够进入到循环体 当i的值为2时循环条件不成立&…

ConcurrentLinkedQueue

唯一一个使用cas实现的线程安全并发效率高的集合。 一、为什么叫松散队列? 链表是松散的,链表节点并不都是有效的,允许存在无效节点valnull,但是只有最后一个节点才能nextnull 为什么线程安全需要把链表做成松散的。就是因为入队…