中介者模式 rust和java的实现

文章目录

    • 中介者模式
      • 介绍
      • 实现
      • java
      • rust
      • rust仓库

中介者模式

中介者模式(Mediator Pattern)又被称为 调停者模式 。 它定义了一个中介对象来封装一系列对象之间的交互关系。 中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。 它是一种对象行为型模式。

介绍

  • 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  • 作用:1.通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。2.中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。
  • 应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

实现

我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类 ChatRoom 和 User。User 对象使用 ChatRoom 方法来分享他们的消息。

MediatorPatternDemo,我们的演示类使用 User 对象来显示他们之间的通信。

中介者模式的 UML 图
在这里插入图片描述

java

步骤 1
创建中介类。

ChatRoom.java

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

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
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!");}
}

rust

在rust中,使用日期库需要引入第三方库,所以需要我们在Cargo.toml引入chrono = "0.4.31"


trait Image {fn dispaly(&self);
}
struct RealImage{file_name:String,
}
impl RealImage {fn load_from_disk(&self) {println!("Loading {}",self.file_name)}fn new(file_name:String)->RealImage {let i=RealImage { file_name:file_name.clone() };i.load_from_disk();i}
}impl Image for RealImage {fn dispaly(&self) {println!("Displaying  {}",self.file_name.as_str())}
}
struct  ProxyImage{real_image: RealImage,file_name:String}
impl ProxyImage {fn new(file_name:String)->ProxyImage {ProxyImage{real_image:RealImage::new(file_name.clone()),file_name:file_name}}
}
impl Image for ProxyImage {fn dispaly(&self) {self.real_image.dispaly();}
}
fn main() {let pi=ProxyImage::new("test_10mb.jpg".to_string());pi.dispaly();pi.dispaly();
}

rust仓库

https://github.com/onenewcode/design.git
本教程项目在bin文件夹下的memento.rs文件中

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

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

相关文章

VMware Workstation unrecoverable error: (vmx)

问题: 我将虚拟机挂起后,电脑关机了,再打开时无法恢复虚拟机,查看日志后发现以下错误 2023-12-04T00:35:53.070Z In(05) vmx Msg_Post: Error 2023-12-04T00:35:53.070Z In(05) vmx [msg.log.error.unrecoverable] VMware Workstation unrecoverable error: (vmx) 2023-12-04T…

计算机网络扫盲(4)——时延

一、概述 在这里,我们考虑分组交换网的情况,因特网可以被看成是一种基础设施,该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下,我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

韩语图片文字如何转为纯文本?

如何将上图为韩语的图片转为文本文件?这个需要用到OCR程序,操作方法如下: 一、打开金鸣识别网站。 二、点击“点击添加图片/PDF”,将待识别的图片添加到列表。 三、识别模块点选“通用文字”,输出格式选择“纯文本输出…

陀螺仪LSM6DSV16X与AI集成(1)----轮询获取陀螺仪数据

陀螺仪LSM6DSV16X与AI集成.1--轮询获取陀螺仪数据 概述视频教学样品申请通信模式管脚定义IIC通信模式速率生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置量程和速率配置过滤链轮询读取数据主程序演示 概述 本文将介绍如何使…

脏读、不可重复读、幻读

一、脏读 A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏…

Python链表排序相关问题解法

1 问题 链表实现选择排列中经常会遇到一些问题,那么该如何解决它们呢? 2 方法 这一类问题的基本都是根据题目给定的条件,对链表进行各种组合,如:基于归并排序思想,根据节点的数值,合并两个链表&…

PPT设置背景颜色

问题描述:PPT如何设置背景颜色? 问题解决:设计→设置背景格式→颜色→蓝色(最好选择看着比较舒服的颜色)

131. 分割回文串

题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出:[["a",&q…

数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE 以上三种的区别? 效率?

数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE 以上三种的区别? 效率? DROP、TRUNCATE和DELETE是数据库SQL中用于删除数据或表的三种不同语句,它们之间有以下区别: 1. DROP: - DROP用于删除整个表…

如何通过缺口发现短线机会?

一、认识缺口形态 新手一开始接触技术分析,可能都以为“缺口”是一个很高深的技术形态。其实缺口很简单,就是K线图中的价格空白区域,也就是股价上涨或下跌的过程中,跳过了这个价格。根据跳空的方向不同,缺口可以分为向…

AArch64中的虚拟化

运行在EL2或更高级别的软件具有对虚拟化的几个控制权限: • 第二阶段翻译(Stage 2 translation) • EL1/0指令和寄存器访问trapping • 虚拟异常生成 非安全状态和安全状态下的异常级别(ELs)如下图所示: 在…

Mongodb与MySQL的异同,使用场景,优缺点。。。

Mongodb与MySQL的使用场景有什么不同?列出详细异同及各自的优缺点? 两者对内在的要求如何? MongoDB与MySQL是两种不同类型的数据库管理系统,它们在使用场景、优缺点和内在要求上有很大的不同。 使用场景的不同: Mong…

二分查找算法:搜索有序数组中目标元素的利器

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

解决从cmake编译TensorRT头文件找不到无法调试问题

正常情况下配置c_cpp_properties.json文件 {"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**","/home/sang/packages/TensorRT-8.5.1.7/include" ],"defines&…

uniapp长按图片识别二维码

引用&#xff1a;https://blog.csdn.net/weixin_48596030/article/details/125405779 <image :src"url" mode"widthFix" click.self"previewImage" show-menu-by-longpress"true" style"width: 350rpx;"></image…

每周一算法:背包问题(二)完全背包

完全背包 有 N N N件物品和一个容量是 M M M的背包。每种物品都有无限件可用。第 i i i件物品的体积是 v i v_i vi​&#xff0c;价值是 w i w_i wi​。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。…

SAP_ABAP_RZ11解决SAP运行超时问题 TIME_OUT / rdisp/scheduler/prio_high/max_runtime

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读510次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

shell_80.Linux函数的递归

函数递归 局部函数变量的一个特性是自成体系&#xff08;self-containment&#xff09;。 除了获取函数参数&#xff0c;自成体系的函数不需要使用任何外部资源。 递归算法的经典例子是计算阶乘。一个数的阶乘是该数之前的所有数乘以该数的值。因此 要计算 5 的阶乘&#xff0c…

音频处理关键知识点

1 引言 现实生活中&#xff0c;我们听到的声音都是时间连续的&#xff0c;我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。 目前我们在计算机上进行音频播放都需要依赖于音频文件。音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号…

linux无网络 无ip,显示网络未连接

标题:linux无网络 无ip&#xff0c;显示网络未连接 参考blog&#xff1a;Linux无网络连接问题排查 首先我们发现ens33没有ip地址&#xff0c;说明这个接口并没有被分到ip&#xff1b; 我们可以通过手动方式来给ens33获得网络ip sudo dhclient ens33&#xff0c;之后再输入ifc…