03-JAVA设计模式-中介者模式

news2024/11/29 12:43:17

中介者模式

什么是中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,用于减少对象之间的直接依赖关系,降低它们之间的耦合度,并使得一个对象改变时,所有依赖于它的对象都得到通知并自动更新。在中介者模式中,一个中介者对象来封装一系列对象之间的交互,从而使这些对象不需要显式地相互引用,降低了它们的耦合度。

在 Java 中实现中介者模式,通常涉及以下几个角色:

  • 中介者(Mediator):定义了对象之间的交互方式,协调多个对象之间的行为。
  • 同事类(Colleague):知道中介者的存在,与中介者进行交互,而不需要与其他同事类直接交互。

中介者模式的本质

解耦各个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。

常见使用场景:

  • MVC模式其中C,控制器就是一个中介者对象,M和V都和它打交道。
  • 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
  • 图形界面卡法GUI中,多个组件只见的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象
  • java.lang.reflect.Method#invoke()

案例

A发送消息通过中介者转发给B接收

UML

在这里插入图片描述

实现步骤:

  • 定义同事类接口,接口中定义处理自己事情,接收消息及向中介者发送申请接口
  • 定义中介者接口,接口中定义注册及处理接口
  • 定义同事A,构造方法中传入中介者获取中介者的引用,及完成注册,实现同事类接口
  • 定义同事B,构造方法中传入中介者获取中介者的引用,及完成注册,实现同事类接口
  • 定义中介者实现类,通过MAP存储注册信息及完成转发动作

实现代码

Colleague.java

// 同事类接口
public interface Colleague {
    // 处理自己的事
    void selfAction();
    // 接收消息
    void receiveAction();
    // 向中介者发出申请
    void outAction(String name);
}

Mediator.java

// 中介者接口
public interface Mediator {
    // 注册接口
    void register(String name,Colleague colleague);
    // 处理接口
    void command(String name);
}

ColleagueA.java

// 同事A
public class ColleagueA implements Colleague{

    /** 持有中介者的引用 **/
    private Mediator mediator;

    public ColleagueA(Mediator mediator) {
        this.mediator = mediator;
        // 注册到中介者中
        mediator.register("A",this);
    }

    @Override
    public void selfAction() {
        System.out.printf("%s-发出信息%n",this.getClass().getSimpleName());
    }

    @Override
    public void receiveAction() {
        System.out.printf("%s-接收信息进行处理%n",this.getClass().getSimpleName());
    }

    @Override
    public void outAction(String name) {
        System.out.printf("%s-向中介者发出申请%n",this.getClass().getSimpleName());
        this.mediator.command(name);
    }
}

ColleagueB.java

// 同事B
public class ColleagueB implements Colleague{

    /** 持有中介者的引用 **/
    private Mediator mediator;

    public ColleagueB(Mediator mediator) {
        this.mediator = mediator;
        // 注册到中介者中
        mediator.register("B",this);
    }

    @Override
    public void selfAction() {
        System.out.printf("%s-发出信息%n",this.getClass().getSimpleName());
    }

    @Override
    public void receiveAction() {
        System.out.printf("%s-接收信息进行处理%n",this.getClass().getSimpleName());
    }

    public void outAction(String name) {
        System.out.printf("%s-向中介者发出申请%n",this.getClass().getSimpleName());
        this.mediator.command(name);
    }
}

ConcreteMediator.java

import java.util.HashMap;
import java.util.Map;

// 中介者的具体实现
public class ConcreteMediator implements Mediator {

    /** 定义存储同事集合 */
    private Map<String,Colleague> map = new HashMap<String,Colleague>();

    @Override
    public void register(String name, Colleague colleague) {
        map.put(name,colleague);
    }

    @Override
    public void command(String name) {
        // 传递给接收者
        map.get(name).receiveAction();
    }
}

TestClient.java

package demo1;

/**
 * 测试类
 *
 * @author Anna.
 * @date 2024/4/16 16:15
 */
public class TestClient {
    public static void main(String[] args) {
        // 定义中介者
        Mediator mediator = new ConcreteMediator();
        // 定义同事类
        Colleague a = new ColleagueA(mediator);
        Colleague b = new ColleagueB(mediator);
        // A发出消息
        a.selfAction();
        // 通过中介者转发给B接收消息
        a.outAction("B");
    }
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

【QT学习】7.事件,把文本显示在页面中(文本可变),鼠标指针切换,鼠标左键右键按下,qt设置背景样式

0.创建项目&#xff0c;事件的创建 1.事件的位置 2.这就是多态&#xff0c;子类重写父类函数&#xff0c;子类调用子类函数&#xff0c;也可以调用父类函数。但同函数名 1.要求&#xff1a;文本显示在页面中&#xff08;文本可变&#xff09; 1.文本显示在页面的核心代码 主要步…

链表OJ - 5(合并两个有序链表)

题目描述&#xff08;来源&#xff09; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路 需创建一个头结点&#xff0c;然后从两个链表的表头开始依次比较传入的两个链表的结点的大小&#xff0c;并将两个链表中较小的…

Docker构建Golang项目常见问题

Docker构建Golang项目常见问题 1 dockerfile报错&#xff1a;failed to read expected number of bytes: unexpected EOF2 go mod tidy: go.mod file indicates go 1.21, but maximum supported version is 1.17 1 dockerfile报错&#xff1a;failed to read expected number o…

Linux编辑器gcc/g++的使用以及Makefile的用法

gcc如何完成 格式 gcc [选项] 要编译的文件 [选项] [目标文件] gcc对code.c编译形成可执行文件mybin&#xff0c;十分推荐直接这样写&#xff0c;下面会有拆分写法&#xff08;不推荐&#xff09; gcc与我们使用过的编辑器无二&#xff0c;都需要经过 1. 预处理&#xff08;…

QAnything部署Mac m1环境

本次安装时Qanything已经更新到了v1.3.3&#xff0c;支持纯python安装。安装过程比较简单&#xff0c;如下&#xff1a; QAnything/README_zh.md at qanything-python-v1.3.1 netease-youdao/QAnything GitHub 首先需要用Anaconda3创建隔离环境&#xff0c;简要说明下Anaco…

Word分节后,页码不连续、转PDF每节后多出空白页解决办法

1. 问题图例 废话少说&#xff0c;先上图&#xff1a; 2. 问题分析 问题分析&#xff1a;出现以上问题的原因可能有&#xff0c; 未链接到上一节页面布局中节的起始位置设置为[奇数页] 3. 解决问题 若为【1. 未链接到上一节】导致该问题出现&#xff0c;则我们需要选中页脚…

PACNet CellNet(代码开源)|bulk数据作细胞分类,评估细胞命运性能的一大利器

文章目录 1.前言2.CellNet2.1CellNet简介2.2CellNet结果 3.PACNet3.1安装R包与加载R包3.2加载数据3.3开始训练和分类3.4可视化分类过程3.5可视化分类结果 4.细胞命运分类和免疫浸润比较 1.前言 今天冲浪看到一个细胞分类性能评估的R包——PACNet&#xff0c;它与转录组分析方法…

Easy GIS .NET GMap.Net

Easy GIS .NET & GMap.Net .NET 环境下非常简单的GIS地图开发库。 Easy GIS .NET 一个简单的GIS 桌面应用程序&#xff0c;实现了地图瓦片加载、shapefile文件和csv文件加载渲染、地图坐标系统设置及转换等等基本功能&#xff0c;非常简单易用。 Easy GIS .NET is an o…

论文浅尝 | QA-GNN:结合语言模型与知识图谱进行问答推理

笔记整理&#xff1a;项卓怡&#xff0c;浙江大学硕士&#xff0c;研究方向为生化大模型。 链接&#xff1a;https://arxiv.org/abs/2104.06378 Code&#xff1a;https://github.com/michiyasunaga/qagnn Citation: Yasunaga M, Ren H, Bosselut A, et al. QA-GNN: Reasoning w…

pytest学习-pytorch单元测试

pytorch单元测试 一.公共模块[common.py]二.普通算子测试[test_clone.py]三.集合通信测试[test_ccl.py]四.测试命令五.测试报告 希望测试pytorch各种算子、block、网络等在不同硬件平台,不同软件版本下的计算误差、耗时、内存占用等指标. 本文基于torch.testing._internal 一…

Python基于Django搜索的目标站点内容监测系统设计,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Android Studio XML 预览View 底部移动到右边

以前 XML 的预览都是在右边的&#xff0c;最近不知道为什么突然到下面去了&#xff0c;很不习惯 找半天想把 预览view 移动到右边&#xff0c;一直没找到按钮。 误打误撞移回来了&#xff0c;原来只要再点击一次 split&#xff0c;就可以变动位置了&#xff0c;记录一下。

ChatGPT及GIS、生物、地球、农业、气象、生态、环境科学领域案例

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

C++教你如何模拟实现string,如何实现string写时拷贝

文章目录 前言成员变量默认成员函数默认构造函数拷贝构造函数析构函数赋值运算符重载 容量相关函数&#xff08;Capacity&#xff09;reserve函数resize函数size函数capacity 函数clear函数 修改函数&#xff08;Modifiers&#xff09;swap函数insert函数字符插入字符串插入 ap…

未来城市可视化,A3D引擎支持,免费搭建全新一代数字孪生!

AMRT3D数字孪生引擎https://www.amrt3d.com/#/ 什么是未来城市&#xff1f;它是新型数字化理念的载体&#xff0c;以数字孪生与物理世界城市的融合为核心&#xff0c;通过数字孪生技术在数字空间实时构建城市&#xff0c;采用数据整合和分析预测来实时模拟、预测、控制整体城市…

uniapp之消除图片的空白占用空间

我们在使用uniapp开发的过程中一定会遇到一个情况就是我们加载的图片总有一点空白出现在不该出现的地方代码如下 <view style"background:#ff0000;"><image style"width:100%;"src"https://t7.baidu.com/it/u1819248061,230866778&fm19…

[论文笔记]Root Mean Square Layer Normalization

引言 今天带来论文Root Mean Square Layer Normalization的笔记&#xff0c;论文题目是均方根层归一化。 本篇工作提出了RMSNorm&#xff0c;认为可以省略重新居中步骤。 简介 层归一化对Transformer等模型非常重要&#xff0c;它可以帮助稳定训练并提升模型收敛性&#xf…

uniapp-小程序保存图片到相册

小程序保存图片到相册 一. 将图片保存到手机相册涉及的api 有以下几个 1. uni.getSetting (获取用户的当前设置) 2. uni.authorize&#xff08;提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据&#xff0c;但不会实际调…

GPT国内能用吗

2022年11月&#xff0c;Open AI发布ChatGPT&#xff0c;ChatGPT展现了大型语模型在自然语言处理方面的惊人进步&#xff0c;其生成文本的流畅度和连贯性令人印象深刻&#xff0c;为AI应用打开了新的可能性。 ChatGPT的出现推动了AI技术在各个领域的应用&#xff0c;例如&#x…

『Django』创建app(应用程序)

theme: smartblue 本文简介 点赞 关注 收藏 学会了 在《『Django』环境搭建》中介绍了如何搭建 Django 环境&#xff0c;并且创建了一个 Django 项目。 在刚接触 Django 时有2个非常基础的功能是需要了解的&#xff0c;一个是“app”(应用程序)&#xff0c;另一个是 url(路由…