19-Java中介者模式 ( Mediator Pattern )

Java中介者模式

    • 摘要
    • 实现
    • 范例

  • 中介者模式(Mediator Pattern)提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护
  • 中介者模式是用来降低多个对象和类之间的通信复杂性
  • 中介者模式属于行为型模式

摘要

1. 意图

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

2. 主要解决

  • 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理

3. 何时使用

  • 多个类相互耦合,形成了网状结构

4. 如何解决

  • 将上述网状结构分离为星型结构

5. 关键代码

  • 对象Colleague 之间的通信封装到一个类中单独处理

6. 应用实例

  • 中国加入WTO之前是各个国家相互贸易,结构复杂,现在是各个国家通过WTO来互相贸易;
  • 机场调度系统;
  • MVC框架,其中C(控制器)就是M(模型)和V(视图)的中介者;

7. 优点

  • 降低了类的复杂度,将一对多转化成了一对一;
  • 各个类之间的解耦;
  • 符合迪米特原则;

8. 缺点

  • 中介者会庞大,变得复杂难以维护

9. 使用场景

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象;
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类;

10. 注意事项

  • 不应当在职责混乱的时候使用

实现

在这里插入图片描述

我们通过聊天室实例来演示中介者模式:多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息

  1. 定义中介类ChatRoom;
  2. 定义用户类User,User对象使用ChatRoom方法来分享他们的消息;
  3. 定义MediatorPatternDemo类使用User对象来显示他们之间的通信;

范例

1. 创建中介类

ChatRoom.java

package com.demo.gof;
import java.util.Date;public class ChatRoom {public static void showMessage(User user, String message){System.out.println(new Date().toString()+ " [" + user.getName() +"] : " + message);}
}

2. 创建 user 类

User.java

package com.demo.gof;
public class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name){this.name  = name;}public void sendMessage(String message){ChatRoom.showMessage(this,message);}
}

3. 使用 User 对象来显示他们之间的通信

MediatorPatternDemo.java

package com.demo.gof;
public class MediatorPatternDemo {public static void main(String[] args) {User robert = new User("Robert");User john = new User("John");robert.sendMessage("Hi! John!");john.sendMessage("Hello! Robert!");}
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/MediatorPatternDemo.java
$ java  com.demo.gof.MediatorPatternDemo
Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!

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

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

相关文章

每周一算法:A*(A Star)算法

八数码难题 题目描述 在 3 3 3\times 3 33 的棋盘上,摆有八个棋子,每个棋子上标有 1 1 1 至 8 8 8 的某一数字。棋盘中留有一个空格,空格用 0 0 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局…

【RT-DETR有效改进】全新的SOATA轻量化下采样操作ADown(轻量又涨点,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的RT-DETR的项目,经过实验我发现该卷积模块(作为下采样模块)…

nicegui学习使用

https://www.douyin.com/shipin/7283814177230178363 python轻量级高自由度web框架 - NiceGUI (6) - 知乎 python做界面,为什么我会强烈推荐nicegui 秒杀官方实现,python界面库,去掉90%事件代码的nicegui python web GUI框架-NiceGUI 教程…

嵌入式学习第二十五天!(网络的概念、UDP编程)

网络: 可以用来:数据传输、数据共享 1. 网络协议模型: 1. OSI协议模型: 应用层实际收发的数据表示层发送的数据是否加密会话层是否建立会话连接传输层数据传输的方式(数据包,流式)网络层数据的…

吴恩达深度学习笔记:神经网络的编程基础2.1-2.3

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第二周:神经网络的编程基础 (Basics of Neural Network programming)2.1 二分类(Binary Classification)2.2 逻辑回归(Logistic Regression) 第一门课:神经网络和深度学…

基于YOLOv5的无人机视角水稻杂草识别检测

💡💡💡本文主要内容:详细介绍了无人机视角水稻杂草识别检测整个过程,从数据集到训练模型到结果可视化分析。 博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点…

Github 2024-03-08 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-08统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9C++项目1非开发语言项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:OtherStar数量:63556…

网络原理初识(2)

目录 一、协议分层 1、分层的作用 2、OSI七层模型 3、TCP / IP五层(或四层)模型 4、网络设备所在分层 5、网络分层对应 二、封装和分用 发送过程(封装) 1、应用层(应用程序) QQ 2、输入层 3、网络层 4、数据链路层 5、物理…

金融行业专题|基金超融合架构转型与场景探索合集(2023版)

更新内容 更新 SmartX 超融合在基金行业的覆盖范围、部署规模与应用场景。更新信创云资源池、关键业务系统性能优化等场景实践。更多超融合金融核心生产业务场景实践,欢迎下载阅读电子书《金融核心生产业务场景探索文章合集》。 随着数字化经济的蓬勃发展&#xf…

记一次Flink任务无限期INITIALIZING排查过程

1.前言 环境:Flink-1.16.1,部署模式:Flink On YARN,现象:Flink程序能正常提交到 YARN,Job状态是 RUNNING,而 Task状态一直处于 INITIALIZING,如下图: 通过界面可以看到…

ue4.27 发现 getRandomReachedLocation 返回 false

把这个玩意儿删掉,重启工程,即可 如果还不行 保证运动物体在 volum 内部,也就是绿色范围内确保 project setting 里面的 navigation system 中 auto create navigation data 是打开的(看到过博客说关掉,不知道为啥) 如果还不行&…

智奇科技工业 Linux 屏更新开机logo

智奇科技工业 Linux 屏更新开机logo 简介制作logo.img文件1、转换格式得到logo.bmp2、使用Linux命令生成img文件 制作rootfs.img文件替换rootfs.img中的logo 生成update.img固件附件 简介 智奇科技的 Linux 屏刷开机logo必须刷img镜像文件,比较复杂。 制作logo.i…

深入浅出(二)MVVM

MVVM 1. 简介2. 示例 1. 简介 2. 示例 示例下载地址:https://download.csdn.net/download/qq_43572400/88925141 创建C# WPF应用(.NET Framework)工程,WpfApp1 添加程序集 GalaSoft.MvvmLight 创建ViewModel文件夹,并创建MainWindowV…

通过对话式人工智能打破语言障碍

「AI突破语言障碍」智能人工智能如何让全球交流无障碍 在当今互联的世界中,跨越语言界限进行交流的能力比以往任何时候都更加重要。 对话式人工智能(包括聊天机器人和语音助手等技术)在打破这些语言障碍方面发挥着关键作用。 在这篇博文中&am…

简站wordpress主题看上去差不多 实际大不一样

有人说简站wordpress主题,都差不多嘛。我表示无语。表面看上去是差不多的,实际的细节是不一样的。 下面以编号:JZP4431和编号:JZP4878这两个主题为例子来讲一下,简站wordpress主题,在细节方面的不一样之处…

【观察】华为:加速行业智能化,正在“走深向实”

毫无疑问,犹如历史上蒸汽机、电力、计算机和互联网等通用技术一样,近20年来,人工智能正以史无前例的速度和深度改变着人类社会和经济,为释放人类创造力和行业生产力,以及促进经济增长都提供了巨大的机会。 根据高盛报告…

字符串函数和内存函数

文章目录 字符串函数strlen函数模拟实现 strcpy函数模拟实现 strcat函数使用模拟实现 strcmp函数使用模拟实现 strncpy函数使用模拟实现 strstr函数使用模拟实现 strtok函数使用 strerror函数使用 内存函数memset函数使用memcmp函数memcpy函数使用模拟实现 memmove函数使用模拟…

【深度优先】【图论】【C++算法】2045. 到达目的地的第二短时间

作者推荐 视频算法专题 LeetCode2045. 到达目的地的第二短时间 城市用一个 双向连通 图表示,图中有 n 个节点,从 1 到 n 编号(包含 1 和 n)。图中的边用一个二维整数数组 edges 表示,其中每个 edges[i] [ui, vi] 表…

HCIP---IS-IS协议

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.IS-IS协议概述 IS-IS是一种基于链路状态的内部网关协议(IGP),它使用最短路径优先算法(SPF或Dijkstra)进行路由计算。这种协议在自治…

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类: 单钥加密(private key cryptography):加密和解密过程都用同一套密码双钥加密(public key cryptography):加密和解密过程用的是两套密码 历史上&#xff0c…