[设计模式 Go实现] 行为型~中介者模式

中介者模式

中介者模式封装对象之间互交,使依赖变的简单,并且使复杂互交简单化,封装在中介者中。

例子中的中介者使用单例模式生成中介者。

中介者的change使用switch判断类型。

mediator.go
package mediatorimport ("fmt""strings"
)type CDDriver struct {Data string
}func (c *CDDriver) ReadData() {c.Data = "music,image"fmt.Printf("CDDriver: reading data %s\n", c.Data)GetMediatorInstance().changed(c)
}type CPU struct {Video stringSound string
}func (c *CPU) Process(data string) {sp := strings.Split(data, ",")c.Sound = sp[0]c.Video = sp[1]fmt.Printf("CPU: split data with Sound %s, Video %s\n", c.Sound, c.Video)GetMediatorInstance().changed(c)
}type VideoCard struct {Data string
}func (v *VideoCard) Display(data string) {v.Data = datafmt.Printf("VideoCard: display %s\n", v.Data)GetMediatorInstance().changed(v)
}type SoundCard struct {Data string
}func (s *SoundCard) Play(data string) {s.Data = datafmt.Printf("SoundCard: play %s\n", s.Data)GetMediatorInstance().changed(s)
}type Mediator struct {CD    *CDDriverCPU   *CPUVideo *VideoCardSound *SoundCard
}var mediator *Mediatorfunc GetMediatorInstance() *Mediator {if mediator == nil {mediator = &Mediator{}}return mediator
}func (m *Mediator) changed(i interface{}) {switch inst := i.(type) {case *CDDriver:m.CPU.Process(inst.Data)case *CPU:m.Sound.Play(inst.Sound)m.Video.Display(inst.Video)}
}
mediator_test.go
package mediatorimport "testing"func TestMediator(t *testing.T) {mediator := GetMediatorInstance()mediator.CD = &CDDriver{}mediator.CPU = &CPU{}mediator.Video = &VideoCard{}mediator.Sound = &SoundCard{}//Tigglemediator.CD.ReadData()if mediator.CD.Data != "music,image" {t.Fatalf("CD unexpect data %s", mediator.CD.Data)}if mediator.CPU.Sound != "music" {t.Fatalf("CPU unexpect sound data %s", mediator.CPU.Sound)}if mediator.CPU.Video != "image" {t.Fatalf("CPU unexpect video data %s", mediator.CPU.Video)}if mediator.Video.Data != "image" {t.Fatalf("VidoeCard unexpect data %s", mediator.Video.Data)}if mediator.Sound.Data != "music" {t.Fatalf("SoundCard unexpect data %s", mediator.Sound.Data)}
}

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

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

相关文章

Python 编写代码的工具-交互式环境

交互式环境意思就是我们输入一行代码,按回车,代码就会立马执行并产生结果和显示在窗口中。 要打开Python交互式环境,具体操作如下(win系统): 键盘WINR,再输入指令“cmd”,就可以打开命令提示符…

win下持续观察nvidia-smi

简介:在Windows操作系统中,没有与Linux中watch命令直接对应的内置工具,但有1种方法快速简单的方法可以实现类似的效果,尤其是用于监控类似于nvidia-smi的命令输出。 历史攻略: Python:查看windows下GPU的…

Dubbo服务提供端处理请求的过程剖析

1 处理请求的过程概述 (1)消费端发起TCP连接后,服务提供方的NettyServer的connected方法将被调用; (2)因为Netty默认的线程模型为All,因此AllChannelHandler类把接收到的所有消息(…

PaddlePaddle初使用

模型导出与预测 # -c 后面设置训练算法的yml配置文件 # -o 配置可选参数 # Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。 # Global.save_inference_dir参数设置转换的模型将保存的地址。pytho…

数据库攻防学习之MySQL

MySQL 0x01mysql学习 MySQL 是瑞典的MySQL AB公司开发的一个可用于各种流行操作系统平台的关系数据库系统,它具有客户机/服务器体系结构的分布式数据库管理系统。可以免费使用使用,用的人数很多。 0x02环境搭建 这里演示用,phpstudy搭建的…

华为端口隔离高级用法经典案例

最终效果: pc4不能ping通pc5,pc5能ping通pc4 pc1不能和pc2、pc3通,但pc2和pc3能互通 vlan batch 2 interface Vlanif1 ip address 10.0.0.254 255.255.255.0 interface Vlanif2 ip address 192.168.2.1 255.255.255.0 interface MEth0/0/1 i…

基于SSM的校园快递管理系统

目录 前言 开发环境以及工具 项目功能介绍 学生: 管理员: 详细设计 获取源码 前言 本项目是一个基于IDEA和Java语言开发的基于SSM的校园快递管理系统应用。应用包含学生端和管理员端等多个功能模块。 欢迎使用我们的校园快递管理系统!我…

厦门大学OpenHarmony技术俱乐部开创“1+N”新模式,加速推动产学研融合

12月29日,OpenHarmony技术俱乐部再添重将——在多方见证下,厦门大学OpenHarmony技术俱乐部在翔安校区益海嘉里楼报告厅正式揭牌成立,现场出席领导及师生代表近千人。 成立仪式现场 OpenHarmony技术俱乐部 携手厦门大学共绘开源生态新图景 OpenHarmony是由开放原子开源基金…

揭示AUTOSAR中隐藏的漏洞

AUTOSAR是一个普遍采用的软件框架,用于各种汽车零部件,如ABS, ECU,自动照明、环境控制、充电控制器、信息娱乐系统等。AUTOSAR的创建目的是促进汽车零部件之间形成标准接口,可以在不同制造商之间互通。 因此,任何配备微控制器(MC…

CGAL的无限制的Delaunay图

本章描述了构建L∞距离下线段Delaunay图的算法和几何特征。这些特征还包括绘制L∞距离下线段Delaunay图对偶(即L∞距离下线段Voronoi图)边缘的方法。L∞算法和特征依赖于欧几里得(或L2)距离下的线段Delaunay图算法和特征。L∞度量…

redis 面试问题 (更新中 ing)

reids 是做什么的 为什么那么快 有哪些使用场景 1.数据缓存 2.计数器 3.限时 4.限流 5.分布式锁 6.队列 7.发布 订阅 redis有哪些 数据结构 常用的 string 对字符串 、整数、浮点数list 链表 ,字符串set 不重复集合 ,交集、并集 差集hash 无序散列…

月报总结|Moonbeam 12月份大事一览

一转眼已经到年底啦。本月,Moonbeam基金会发布四个最新战略重点:跨链解决方案、游戏、真实世界资产(RWA)、新兴市场。其中在新兴市场方面,紧锣密鼓地推出与巴西公司Grupo RO的战略合作。 用户教育方面,为了…

大创项目推荐 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人脸表情识别系…

如何使用Python3 Boto3删除AWS CloudFormation的栈(Stacks)

文章目录 小结问题及解决有关Json文件的输入和输出使用Python3及正则表达式查找字符串包含某个子字符串使用Python3 Boto3删除AWS CloudFormation的栈(Stacks) 参考 小结 本文记录了使用Python3的Boto3包删除AWS CloudFormation的栈(Stacks&…

Git从远程仓库拉取指定的分支

一、git clone 命令获取 使用git管理代码版本的时候&#xff0c;本地分支默认与远程同名分支建立追踪关系。文章开始也提到git clone <url>命令默认将整个远程版本库克隆到本地&#xff0c;但是git clone -b <分支名称>命令可以将指定的某一个远程分支拉取到我们本…

优雅地展示20w单细胞热图|非Doheatmap 超大数据集 细胞数太多

单细胞超大数据集的热图怎么画&#xff1f;昨天刚做完展示20万单细胞的热图要这么画吗&#xff1f; 今天就有人发消息问我为啥他画出来的热图有问题。 问题起源 昨天分享完 20万单细胞的热图要这么画吗&#xff1f;&#xff0c;就有人问为啥他的数据会出错。我们先来看下他的…

imgaug库指南(一):从入门到精通的【图像增强】之旅

文章目录 引言imgaug简介安装和导入imgaug代码示例imgaug的强大之处和用途小结结尾 引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和…

(JAVA)-反射

什么是反射&#xff1f; 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问。 说简单点就是反射能将类里面的构造方法&#xff0c;成员变量,修饰符,返回值&#xff0c;注解&#xff0c;类型&#xff0c;甚至异常等类里面的所有东西都能够获取出来。 关于C…

团子杂记:SAP PS or 项目管理软件(PMIS )? PPM/P6

众所周知SAP的PS模块在项目型企业的SAP应用中扮演着核心角色&#xff0c;整个项目端到端的业务执行、财务核算、控制及分析都是通过PS作为主线&#xff0c;依赖于PS中的项目对象&#xff08;如WBS元素、网络活动等&#xff09;实现的。 在实施SAP的过程中&#xff0c;可以看到…

Nest 框架:解锁企业级 Web 应用开发的秘密武器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…