中介者模式(行为型)

目录

一、前言

二、中介者模式

三、总结


一、前言

        中介者模式(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<>();

    @Override
    public void add(Colleague colleague) {
        if (!colleagues.contains(colleague)) {
            colleagues.add(colleague);
            colleague.setMediator(this);
        }
    }

    @Override
    public 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{


    @Override
    public void receive(String message) {
        System.out.println("具体同事类 ConcreteColleagueOne 接收请求:" + message);

    }

    @Override
    public void send(String message) {
        System.out.println("具体同事类 ConcreteColleagueOne 发送请求:" + message);
        mediator.operation(this, message);
    }
}

public class ConcreteColleagueTwo extends Colleague{
    @Override
    public void receive(String message) {
        System.out.println("具体同事类 ConcreteColleagueTwo 接收请求:" + message);
    }

    @Override
    public 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)系统中,中介者模式可以用于协调不同步骤和任务之间的交互,确保按照预定的流程顺序执行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防火墙双机热备(接上一个NAT实验)

一、实验拓扑 二、实验需求 1、对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 2、办公区上网用户限制流量不超过100M&#xff0c;其中销售部人员…

【深度学习】基于深度学习的模式识别基础

一 模式识别基础 “模式”指的是数据中具有某些相似特征或属性的事物或事件的集合。具体来说&#xff0c;模式可以是以下几种形式&#xff1a; 视觉模式 在图像或视频中&#xff0c;模式可以是某种形状、颜色组合或纹理。例如&#xff0c;人脸、文字字符、手写数字等都可以视…

【边缘计算网关教程】8.ModbusTCP采集存储Influxdb

前景回顾-【边缘计算网关教程】7.Modbus协议转MQTT协议-CSDN博客 需求概述 &#x1f4a1;注&#xff1a;使用Influxdb数据库节点&#xff0c;需要插上micro sd卡才可以 本章节主要实现一个流程&#xff1a;EG8200每10秒采集一次Modbus TCP数据存入Influxdb数据库,并且每分钟…

[日进斗金系列]用码上飞解决企微开发维修管理系统的需求

前言&#xff1a; 今天跟大家唠唠如何用小money生 大money的方法&#xff0c;首先我们需要准备一个工具。 这个工具叫码上飞CodeFlying&#xff0c;它是目前国内首发的L4级自动化智能软件开发平台。 它可以在短时间内&#xff0c;与AI进行几轮对话就能开发出一个可以解决实际…

pytorch学习(六):卷积层的使用

卷积函数的概念 卷积核从输入特征图的左上角开始&#xff0c;按照设定的步长&#xff08;Stride&#xff09;滑动。步长决定了卷积核每次滑动的像素数&#xff0c;这里我们假设步长 s1。在每次滑动时&#xff0c;卷积核与输入特征图对应位置的元素相乘&#xff0c;然后将这些乘…

ENSP中VLAN的设置

VLAN的详细介绍 VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是一种将一个物理的局域网在逻辑上划分成多个广播域的技术。 以下是关于 VLAN 的一些详细介绍&#xff1a; 一、基本概念 1. 作用&#xff1a; - 隔离广播域&#xff1a…

Linux 安装 Docker Compose

Docker Compose 是一种用于定义、运行和管理多容器Docker应用程序的工具&#xff0c;通过YAML文件配置服务&#xff0c;实现一键启动和停止所有服务。 以下是如何在 Linux 系统上安装 Docker Compose 的步骤 1. 下载 Docker Compose 可执行文件 wget https://github.com/dock…

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…

暑期大数据人工智能企业项目试岗实训班

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

2024.7.16作业

使用结构体完成学生&#xff08;学号、姓名、性别、成绩&#xff09;管理系统 1> 使用菜单实现 2> 功能1&#xff1a;完成对学生信息的录入&#xff0c;确定人数&#xff0c;完成输入 2> 功能2&#xff1a;完成对学生信息的输出 3> 功能3&#xff1a;输出成绩最…

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的&#xff0c;这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO&#xff08;命名管道&#xff09;在以只读模式打开时&#xff0c;如果没有其他进程以写模式打开该 FIFO&#xff0c;open 调用将…

ASP.NET Core----基础学习07----ViewStart ViewImports文件的使用

文章目录 1._ViewStart.cshtml的使用2.更换Layout文件3._ViewImports.cshtml文件的使用 1._ViewStart.cshtml的使用 step1&#xff1a; 在Views文件夹下面创建_ViewStart.cshtml文件 step2&#xff1a; 删掉视图文件中的Layout设置行 step3&#xff1a; 最终显示效果&#xff…

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现&#xff1f; 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中&#xff0c;有两个基本命令&#xff1…

企业智能制造赋能的环境条件为什么重要?需要准备什么样的环境?

在全球制造业不断演进的今天&#xff0c;智能制造已经成为推动行业创新和转型的关键力量。它不仅代表了技术的革新&#xff0c;更是企业管理模式和运营思路的全面升级。然而&#xff0c;智能制造的落地实施并非一蹴而就&#xff0c;它需要企业在环境条件上做好充分的准备&#…

Java设计模式的7个设计原则

Java设计模式的7个设计原则是面向对象设计领域中的重要指导方针&#xff0c;它们旨在提高软件系统的可维护性、可扩展性、可复用性和灵活性。以下是这7个设计原则的详细解释&#xff1a; 1. 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09; 定义&#xff1a;一个…

tinymce vue拓展多图上传 实现拖拽切换位置,图片排序

实现功能&#xff1a;基于tinymce TinyMCE中文文档中文手册 拖拽图片排序&#xff0c;去掉全部上传按钮&#xff0c;点击保存上传图片并关闭弹窗&#xff0c;优化了一些交互提示 声明&#xff1a;本人不是做vue前端的&#xff0c;可能有些更好的方法实现拖拽或者其他一些开源…

TS 入门(五):TypeScript接口与类

目录 前言回顾高级类型与类型操作1. 接口a. 基本接口b. 可选属性和只读属性c. 函数类型接口d. 可索引类型e. 接口继承 2. 类a. 基本类b. 类的成员&#xff08;属性和方法&#xff09;c. 构造函数d. 继承和派生类e. 公有、私有和受保护的修饰符f. 静态属性和方法g. 抽象类 扩展知…

算法篇 滑动窗口 leetcode 长度最小的子数组

长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook&#xff0c;用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应&#xff0c;useState 让函数组件也能拥有…

借助 Aspose.Words,在 C# 中将 Word 转换为 JPG

有时我们需要将 Word 文档转换为图片&#xff0c;因为 DOC 或 DOCX 文件在不同设备上的显示可能会有所不同&#xff0c;但图像&#xff08;例如 JPG 格式&#xff09;在任何地方看起来都一样。 Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作…