《golang设计模式》第三部分·行为型模式-05-仲裁者/中介模式(Mediator)

本文主要是介绍《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 类图

Mediator
ConcreteMediator
-ConcreteColleagueA:concreteColleagueA
-ConcreteColleagueB:concreteColleagueB
«interface»
Colleague
+mediator:Mediator
ConcreteColleagueA
+Mediator mediator
ConcreteColleagueB
+Mediator mediator

2. 代码示例

2.1 设计

  • 定义抽象仲裁者Mediator
  • 定义具体仲裁者ConcreteMediator
    • 它依赖了需要的具体协作者ConcreteColleagueAConcreteColleagueBConcreteColleagueC
    • 它的Process()方法选择了如何执行何种实际协作者
  • 定义了抽象协作者Colleague
  • 定义了各个实际协作者ConcreteColleagueAConcreteColleagueBConcreteColleagueC
    • 它们实现了抽象协作者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 类图

«interface»
Mediator
+Process(colleague Colleague)
ConcreteMediator
+ConcreteColleagueA:concreteColleagueA
+ConcreteColleagueB:concreteColleagueB
+ConcreteColleagueC:concreteColleagueC
+Process(colleague Colleague)
«interface»
Colleague
Action()
ConcreteColleagueA
+Mediator mediator
+Action()
+Option()
ConcreteColleagueB
+Mediator mediator
+Action()
+Option()
ConcreteColleagueC
+Mediator mediator
+Action()
+Option()

这篇关于《golang设计模式》第三部分·行为型模式-05-仲裁者/中介模式(Mediator)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/363284

相关文章

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.