《golang设计模式》第三部分·行为型模式-05-仲裁者/中介模式(Mediator)
文章目录
- 1. 概述
- 1.1 作用
- 1.2 角色
- 1.3 类图
- 2. 代码示例
- 2.1 设计
- 2.2 代码
- 2.3 类图
1. 概述
仲裁者(Mediator)可以封装和协调多个对象之间的耦合交互行为,以减弱这些对象之间的耦合关联。
1.1 作用
将多个对象相互耦合的设计转变为所有对象通过中介协作,从而降低其耦合性
多个对象相互耦合:
所有对象通过中介(E)相互协作
1.2 角色
抽象仲裁者(Mediator)角色:封装和实现其子类的协作行为。
具体仲裁者(ConcreteMediator)角色:实现仲裁者行为。
抽象协作者类(Colleague)角色:持有指向仲裁者Mediator对象的引用
具体协作者(ConcreteColleague):
1.3 类图
2. 代码示例
2.1 设计
- 定义抽象仲裁者
Mediator - 定义具体仲裁者
ConcreteMediator- 它依赖了需要的具体协作者
ConcreteColleagueA、ConcreteColleagueB、ConcreteColleagueC - 它的
Process()方法选择了如何执行何种实际协作者
- 它依赖了需要的具体协作者
- 定义了抽象协作者
Colleague - 定义了各个实际协作者
ConcreteColleagueA、ConcreteColleagueB、ConcreteColleagueC- 它们实现了抽象协作者
Colleague - 它们都依赖了抽象仲裁者
Mediator - 它们的
Action()方法,通过所依赖的仲裁者,执行对应的实际协作者的Option()方法 - 它们的
Option()方法,是实际协作中的操作
- 它们实现了抽象协作者
- 调用
- 实例化一个具体仲裁者
- 实例化三个具体协作者
- 每个具体协作者关联仲裁者实例
- 分别执行三个仲裁者的Action()方法完成每一次协作
2.2 代码
- 代码
package mainimport "fmt"// 抽象中介
type Mediator interface {Process(colleague Colleague)
}// 实际中介,它持有所有具体协作者
type ConcreteMediator struct {concreteColleagueA *ConcreteColleagueAconcreteColleagueB *ConcreteColleagueBconcreteColleagueC *ConcreteColleagueC
}// 该方法实现了各协作者之间通过实际中介的相互协作(该例中实际中介同时维护了实际协作者的协作关系)
func (cm *ConcreteMediator) Process(colleague Colleague) {switch {case colleague == cm.concreteColleagueA:cm.concreteColleagueA.Option()cm.concreteColleagueC.Option()case colleague == cm.concreteColleagueB:cm.concreteColleagueB.Option()cm.concreteColleagueC.Option()case colleague == cm.concreteColleagueC:cm.concreteColleagueC.Option()}
}// 抽象协作者
type Colleague interface {Action()
}// 定义实际协作者A,它关联了中介
type ConcreteColleagueA struct {mediator Mediator
}// 该方法调用中介,已达到调用其他协作者的目的(调用顺序由中介维护)
func (a *ConcreteColleagueA) Action() {a.mediator.Process(a)
}// 该方法是协作者A自身的操作
func (e *ConcreteColleagueA) Option() {fmt.Println("ConcreteColleagueA")
}// 实际协作者B(说明同协作者A)
type ConcreteColleagueB struct {mediator Mediator
}func (e *ConcreteColleagueB) Action() {e.mediator.Process(e)
}func (e *ConcreteColleagueB) Option() {fmt.Println("ConcreteColleagueB")
}// 实际协作者C(说明同协作者A)
type ConcreteColleagueC struct {mediator Mediator
}func (t *ConcreteColleagueC) Action() {t.mediator.Process(t)
}func (t *ConcreteColleagueC) Option() {fmt.Println("ConcreteColleagueC")
}func main() {//实例化一个具体中介concreteMediator := &ConcreteMediator{}//实例化三个实际协作者concreteColleagueA := &ConcreteColleagueA{mediator: concreteMediator,}concreteColleagueB := &ConcreteColleagueB{mediator: concreteMediator,}concreteColleagueC := &ConcreteColleagueC{mediator: concreteMediator,}//具体中介应持有所有协作者concreteMediator.concreteColleagueA = concreteColleagueAconcreteMediator.concreteColleagueB = concreteColleagueBconcreteMediator.concreteColleagueC = concreteColleagueC//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者concreteColleagueA.Action()//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者concreteColleagueB.Action()//协作者A的Action()方法向它的实际中介请求,并由中介按它维护的顺序依次调用协作者concreteColleagueC.Action()
}
- 输出
2.3 类图
相关文章:
《golang设计模式》第三部分·行为型模式-05-仲裁者/中介模式(Mediator)
文章目录 1. 概述1.1 作用1.2 角色1.3 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 仲裁者(Mediator)可以封装和协调多个对象之间的耦合交互行为,以减弱这些对象之间的耦合关联。 1.1 作用 将多个对象相互耦合的设计转变为所有对象…...
7天入门python系列之准备工作
寄语 编者打算开一个python 初学主题的系列文章,用于指导想要学习python的同学。关于文章有任何疑问都可以私信作者。对于初学者想在7天内入门Python,这是一个紧凑的学习计划。但并不是不可完成的。 7天的安排 如果你想在7天内入门Python,…...
Go语言~反射
reflect包 type name和type kindValueOf通过反射获取值通过反射设置变量的值 package mainimport ("fmt""reflect" )func reflectType(x interface{}) {obj : reflect.TypeOf(x)fmt.Println(obj, obj.Name(), obj.Kind())fmt.Printf("obj type of %…...
详解交叉验证中【KFold】【Stratified-KFold】【StratifiedShuffleSplit】的区别
交叉验证是一种统计分析方法,它的目的是通过在同一数据集上重复并分割训练和测试数据,来评估机器学习模型的性能。以下是这三种交叉验证方法的区别: KFold(K-折叠) 在KFold交叉验证中,原始数据集被分为K个…...
数学建模比赛中常用的建模提示词(数模prompt)
以下为数学建模比赛中常用的建模提示词,希望对你有所帮助! 帮我总结一下数学建模有哪些预测类算法? 灰色预测模型级比检验是什么意思? 描述一下BP神经网络算法的建模步骤 对于分类变量与分类变量相关性分析用什么算法 前10年的数据分别是1&a…...
Spark 新特性+核心回顾
Spark 新特性核心 本文来自 B站 黑马程序员 - Spark教程 :原地址 1. 掌握Spark的Shuffle流程 1.1 Spark Shuffle Map和Reduce 在Shuffle过程中,提供数据的称之为Map端(Shuffle Write)接收数据的称之为Reduce端(Sh…...
STM32 TIM定时器,配置,详解(1)
计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR)。 PSC预分频器,顾名思义,先预备一下分频,有时候频率过高,后面的定时器承受不住,就先用PSC先分频一下。如何分频的?将每接受到…...
Helix Toolkit:为.NET开发者带来的3D视觉盛宴
推荐一个基于.Net开源的3、功能强大的3D图形库和工具包,适用于WPF应用程序的3D渲染和开发。 01 项目简介 Helix Toolkit是一个开源的3D库,主要用于WPF应用程序。它有许多优点,例如提供各种各样的功能,包括基于MVVM的3D模型编辑器…...
PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程
大家好啊!今天源码小编来给大家分享一款PHP分类信息网站类源码系统。这款源码系统是一套专业的信息发布类网站综合管理系统,适合各类地方信息和行业分类站点建站。随着这几年我们国家网民爆炸式的增 长,网络信息也随之越来越庞大,…...
2023年辽宁省数学建模竞赛B题数据驱动的水下导航适配区分类预测
2023年辽宁省数学建模竞赛 B题 数据驱动的水下导航适配区分类预测 原题再现: “海洋强国”战略部署已成为推动中国现代化建设的重要组成部分,国家对此提出“发展海洋经济,保护海洋生态环境,加快建设海洋强国”的明确要求。 …...
完蛋!百融云被大阳线包围了!
没想到让AI指数爬出底部的,不是离婚的两口子承诺不减持了,而是国产游戏圈神作《完蛋!我被女友包围了》。确实,资本市场不相信眼泪,AI的涨跌也与爱情无关。 之前有一个来自美国和澳大利亚的大数据团队做过一个有趣的统…...
数据结构 编程1年新手视角的平衡二叉树AVL从C与C++实现③
对应地,我们可以将insert函数中省略的操作补上 if(getBalance(node)2){ if(getBalance(node->left)1){ noderightRotate(node); //对应LL型 } else if(getBalance(node->left)-1{ node->left leftRotate(node->left); //对应LR型 noderightRotate(n…...
数据可视化PCA与t-SNE
PCA(主成分分析)和t-SNE(t分布随机近邻嵌入)都是降维技术,可以用于数据的可视化和特征提取。 降维:把数据或特征的维数降低,其基本作用包括: 提高样本密度,以及使基于欧…...
Kubernetes rancher、prometheus、ELK的安装
目录 一、rancher的安装1. 添加 Helm Chart 仓库2. 为 Rancher 创建命名空间3. 选择 SSL 配置4. 安装 cert-manager 二、prometheus安装三、EFK安装3.1安装elasticsearch3.2安装filebeat3.3安装kibana 一、rancher的安装 有关rancher的安装其实官方网站给的步骤已经很详细了&a…...
为什么我们要努力的学习编程?初学编程从哪里开始学起?
为什么我们要努力的学习编程?初学编程从哪里开始学起? 1、不论在哪里上班,都不是铁饭碗:现在全球经济低迷,使得很多企业倒闭,大到知名国企小到私营企业,大量裁员。任何人都无法保证自己现在的工…...
ffmpeg 从内存中读取数据(或将数据输出到内存)
1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开。 2.增加了将数据输出到内存的方法。 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件,例如“C:\test.avi” 或者是一个流媒体协议的URL,例如“rtmp:/…...
Flink(一)【WordCount 快速入门】
前言 学完了 Hadoop、Spark,本想着先把 Kafka、Flume 这些工具先学完的,但想了想还是把核心的技术先学完最后再去把那些工具学学。 最近心有点累哈哈哈,偷偷立个 flag,反正也没人看,明年的今天来这里还愿哈,…...
【Redis】hash数据类型-常用命令
文章目录 前置知识常用命令HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGET关于HMSETHLENHSETNXHINCRBYHINCRBYFLOAT 命令小结 前置知识 redis自身就是键值对结构了,哈希类型是指值本⾝⼜是⼀个键值对结构,形如key"key",value{{field1…...
【大数据】Apache NiFi 数据同步流程实践
Apache NiFi 数据同步流程实践 1.环境2.Apache NIFI 部署2.1 获取安装包2.2 部署 Apache NIFI 3.NIFI 在手,跟我走!3.1 准备表结构和数据3.2 新建一个 Process Group3.3 新建一个 GenerateTableFetch 组件3.4 配置 GenerateTableFetch 组件3.5 配置 DBCP…...
git怎么使用 拉取代码
废话不多说 直接开干 Git 是一款十分实用的版本控制工具,非常方便地管理代码的变更。但是,在使用 Git 过程中,不可避免地会遇到一些问题。其中,删除分支是一个常见的问题。 查看引用历史记录: git reflog找到你删除的…...
避开SAP记账第一个坑:F-02凭证录入的5个细节与FS10N对账技巧
SAP财务实操避坑指南:F-02凭证录入的5个关键细节与FS10N高效对账技巧 刚接触SAP FI模块的中级用户,往往在完成基础培训后信心满满地开始独立操作,却在F-02凭证录入时频频踩坑。这些看似简单的字段选择背后,隐藏着财务逻辑与系统设…...
Analog入门指南:如何在5分钟内搭建你的第一个Angular全栈应用
Analog入门指南:如何在5分钟内搭建你的第一个Angular全栈应用 【免费下载链接】analog The fullstack meta-framework for Angular. Powered by Vite and Nitro 项目地址: https://gitcode.com/gh_mirrors/an/analog Analog是一个功能强大的Angular全栈元框架…...
干农活总腰疼?农民朋友别再硬扛腰突
经常弯腰种地、扛重物、干农活,很多农民朋友常年腰疼,总觉得累点正常,咬牙硬扛。 殊不知慢慢发展成腰间盘突出,坐骨神经疼、腿麻无力,后期连农活都干不了。乱贴偏方、盲目正骨,还容易加重病情。我院 30 多年…...
Python 3.13.7(发布于 2025 年 8 月 14 日)在 Windows 平台上的官方下载选项列表
Python 3.13.7(发布于 2025 年 8 月 14 日)在 Windows 平台上的官方下载选项列表,包含多种架构(x64、x86/32-bit、ARM64)和两种分发形式: Windows installer:标准图形化安装程序(含…...
二维码修复:3大场景+5步流程,零代码基础也能掌握的受损二维码恢复指南
二维码修复:3大场景5步流程,零代码基础也能掌握的受损二维码恢复指南 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 日常生活中,我们经常遇到二维码因污渍…...
Windows 11终极优化指南:用Win11Debloat实现系统加速51%的免费方案
Windows 11终极优化指南:用Win11Debloat实现系统加速51%的免费方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...
OpenClaw与Qwen3-14B联调指南:解决模型响应超时与截断问题
OpenClaw与Qwen3-14B联调指南:解决模型响应超时与截断问题 1. 问题背景与挑战 上周我在尝试用OpenClaw自动化处理一批技术文档时,遇到了一个棘手的问题:当任务链超过5个步骤时,Qwen3-14B模型经常出现响应超时或输出截断。这直接…...
从数学原理到代码实现:手把手推导Transformer时间复杂度公式(附PyTorch示例)
从数学原理到代码实现:手把手推导Transformer时间复杂度公式(附PyTorch示例) 在自然语言处理领域,Transformer架构已经成为事实上的标准模型。但当我们处理长文本序列时,经常会遇到计算资源急剧增加的问题。这背后的核…...
AI编程实战:工具选型、效率提升与代码优化技巧
2026年,AI编程已进入“自动驾驶时代”,据行业数据显示,AI编程工具可使开发者效率提升30%-70%,中小企业开发成本降低70%,个人开发者可快速实现产品落地。对于开发者而言,熟练运用AI编程工具,不是…...
剪映高级感文字动画素材合集 预设+教程全整理
平时做口播视频时,总觉得文字动画的精致度跟不上内容节奏,找适配的素材又要花不少时间,所以最近整理了一份剪映高级感口播动态文字动画素材合集,涵盖预设、教程和配套排查资料,今天分享给有同样需求的朋友。 一、素材合…...

