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

news2024/11/26 1:36:25

文章目录

  • 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 main

import "fmt"

// 抽象中介
type Mediator interface {
	Process(colleague Colleague)
}

// 实际中介,它持有所有具体协作者
type ConcreteMediator struct {
	concreteColleagueA *ConcreteColleagueA
	concreteColleagueB *ConcreteColleagueB
	concreteColleagueC *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 = concreteColleagueA
	concreteMediator.concreteColleagueB = concreteColleagueB
	concreteMediator.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()

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

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

相关文章

k8s部署srs服务

k8s部署srs服务 项目需要把srs纳入k8s进行管理,需要通过k8s来部署srs服务然后原本的srs可以支持rtmp与webrtc两种,官网查了部署方式,k8s只有最基本的部署方式于是开始研究k8s部署能够正常推拉流的webrtc版本的srs 首先肯定是去官网查有无相关…

在Ansible中编写剧本实现批量服务器安全加固

1.摘要 在上一篇<<初步利用Ansible实现批量服务器自动化管理>>文章中, 我初步实现了通过编写清单和剧本来实现多台服务器的自动化管理,在本章节中, 我将利用Ansible的剧本来实现更实用、更复杂一点的功能, 主要功能包括三个:1.同时在三台服务器中增加IP访问控制,只…

pytorch之relu激活函数

目录 1、relu 2、relu6 3、leaky_relu 4、ELU 5、SELU 6、PReLU 1、relu ReLU&#xff08;Rectified Linear Unit&#xff09;是一种常用的神经网络激活函数&#xff0c;它在PyTorch中被广泛使用。ReLU函数接受一个输入值&#xff0c;如果该值大于零&#xff0c;则返回该…

PolarDB 卷来卷去 云原生低延迟强一致性读 1 (SCC READ 译 )

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友…

基于Fuzzing和ChatGPT结合的AI自动化测试实践分享

一、前言 有赞目前&#xff0c;结合insight接口自动化平台、horizons用例管理平台、引流回放平台、页面比对工具、数据工厂等&#xff0c;在研发全流程中&#xff0c;已经沉淀了对应的质量保障的实践经验&#xff0c;并在逐渐的进化中。 在AI能力大幅进步的背景下&#xff0c…

LeetCode 热题100——链表专题(二)

一、环形链表 141.环形链表&#xff08;题目链接&#xff09; 思路&#xff1a;使用快慢指针&#xff0c;慢指针走一步&#xff0c;快指针走俩步&#xff0c;如果是环形链表&#xff0c;那么快慢指针一定相遇&#xff0c;如果不是环形结构那么快指针或者快指针的next一定先为N…

Python 中 Selenium 的 getAttribute() 函数

Selenium 的 Python 模块旨在提供自动化测试过程。 Selenium Python 绑定包括一个用于编写 Selenium WebDriver 功能/验收测试的简单 API。 拥有移动能力并没有多大好处。 我们想要与页面交互&#xff0c;或者更准确地说&#xff0c;与组成页面的 HTML 片段交互。 本文将解释…

基于springboot和vue的校园二手物品交易管理系统

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;全网最低价&#xff0c;9.9拿走&#xff01; 基于VUE的校园二手物品交易管理系统8 1、项目介绍 基于VUE的校园二手物品交易管理系统8拥有两种角色 管理员&#xff1a;闲置物品管理、订单管理、用户管理 用户…

Flink ON Yarn 模式 --- per job mode 与application mode的区别

1、per job mode&#xff1a; 对于yarn-per-job模式调度的过程&#xff1a; 1、资源调度&#xff1a; 1、因为是yarn模式&#xff0c;所以客户端会向ResourceManager申请资源&#xff0c;申请容器负责来启动ApplicationManager 2、此时ResourceManager接受到客户端的请求&#…

阿里开源中间件一览

1. 概述以及竞品对比 间件介绍官方链接竞品竞品介绍异同点对比Dubbo高性能的RPC框架&#xff0c;用于实现分布式服务的调用和管理。DubbogRPC gRPC是由Google开源的一款高性能、通用的RPC框架&#xff0c;支持多种编程语言 链接&#xff1a;gRPC Dubbo更注重于服务治理和可扩展…

1-前端基本知识-JavaScript

1-前端基本知识-JavaScript 文章目录 1-前端基本知识-JavaScript总体概述JS基础JS特点JS组成部分JS的引入方式 JS的数据类型基本数据类型引用数据类型 JS的变量JS的运算符算数运算符复合算数运算符关系运算符逻辑运算符条件运算符位运算符 JS的流程控制语句和函数流程控制-分支…

Git查询某次提交属于哪个分支

在Android studio&#xff08;JetBrains系列也类似&#xff09;左下角&#xff0c;可以看到所有提交信息。 选中某一次提交信息&#xff0c;右键&#xff0c;选择“Copy Revision Number”&#xff0c;如下图&#xff1a; 打开Android studio的Terminal&#xff0c;输入git b…

力扣日记11.7-【二叉树篇】二叉树的层序遍历

力扣日记&#xff1a;【二叉树篇】二叉树的层序遍历 日期&#xff1a;2023.11.7 参考&#xff1a;代码随想录、力扣 102. 二叉树的层序遍历 题目描述 难度&#xff1a;中等 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;…

PYQT5如何实现radio和tabwidget的互相联动,点击radio切换tabwidget

最近开发界面&#xff0c;需要做一个功能&#xff1a;tabwidget下面有两个界面&#xff0c;对应两个radio&#xff0c;在我点击一个radio的时候&#xff0c;底下的页面也会随之跳转。 分为几个步骤&#xff1a; 1、将两个radio独立&#xff0c;就是点其中一个的时候&#xff0c…

-Xms8g -Xmx8g -Xmn3g 生产事故-记一次特殊的OOM排查

-Xms8g -Xmx8g -Xmn3g 生产事故-记一次特殊的OOM排查 事故背景 C公司开发人员向A公司开发人员反映某开放接口从2023年3月10日14时许开始无法访问和使用。该系统为某基础数据接口服务&#xff0c;基于 HTTP 协议进行通信。按照惯例&#xff0c;首先排查网络是否异常&#xff0…

5-Servlet

5-Servlet 文章目录 5-ServletServlet概述补充概念&#xff1a;静态资源和动态资源Servlet简介 Servlet开发流程开发方式1--XML配置步骤1&#xff1a;新建一个module&#xff0c;并将其改为Web类型步骤2&#xff1a;开发一个Java类&#xff0c;名为&#xff1a;UserServlet步骤…

【Spring】使用注解开发前提条件

前提&#xff1a;导入约束&#xff0c;添加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:con…

浮点数存储

//浮点数存储 int main() {int n 9;//00000000 00000000 00000000 00001001//0 00000000 00000000000000000001001//S E(8bit) M(23bit)//E-126//M0.000000000000000000001001// 0.000000000000000000001001 *2^-126float* pFloat (float*)&n;printf("n的值…

阿里云中的云服务器的ubuntu中的vim没有显示行号

没有行号&#xff1a; 在终端输入命令&#xff1a; vim ~/.vimrc set nu