【设计模式】第19节:行为型模式之“中介模式”

news2024/12/22 22:54:02

一、简介

中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。

中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。原来一个对象要跟n个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。

二、适用场景

  • 复杂通信对象组
  • 重用对象

三、UML类图

请添加图片描述

四、案例

飞机向其他飞机广播信息。

package main

import "fmt"

type Mediator interface {
	Send(message string, sender *Airplane)
}

type Airplane struct {
	Name     string
	Mediator Mediator
}

func NewAirplane(name string, mediator Mediator) *Airplane {
	return &Airplane{Name: name, Mediator: mediator}
}

func (a *Airplane) Send(message string) {
	fmt.Printf("%v sends message: %v\n", a.Name, message)
	a.Mediator.Send(message, a)
}

func (a *Airplane) Receive(message string) {
	fmt.Printf("%v receives message: %v\n", a.Name, message)
}

type AirTrafficControl struct {
	AirplaneList []*Airplane
}

func NewAirTrafficControl() *AirTrafficControl {
	return &AirTrafficControl{AirplaneList: []*Airplane{}}
}

func (atc *AirTrafficControl) RegisterAirplane(airplane *Airplane) {
	atc.AirplaneList = append(atc.AirplaneList, airplane)
}

func (atc *AirTrafficControl) Send(message string, airlane *Airplane) {
	for _, curr := range atc.AirplaneList {
		if airlane.Name != curr.Name {
			curr.Receive(message)
		}
	}
}

func main() {
	atc := NewAirTrafficControl()
	airplane1 := NewAirplane("Airplane1", atc)
	airplane2 := NewAirplane("Airplane2", atc)
	airplane3 := NewAirplane("Airplane3", atc)

	atc.RegisterAirplane(airplane1)
	atc.RegisterAirplane(airplane2)
	atc.RegisterAirplane(airplane3)

	airplane1.Send("Hello, everyone!")
	airplane2.Send("Hello, everyone!")
	airplane3.Send("Hello, everyone!")
}

五、对比

观察者模式和中介模式都是为了实现参与者之间的解耦,简化交互关系。两者的不同在于应用场景上。在观察者模式的应用场景中,参与者之间的交互比较有条理,一般都是单向的,一个参与者只有一个身份,要么是观察者,要么是被观察者。而在中介模式的应用场景中,参与者之间的交互关系错综复杂,既可以是消息的发送者、也可以同时是消息的接收者。

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

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

相关文章

分享个自己写的小程序解包工具

闲聊 前几天在吾爱破解上看到一个小程序逆向的帖子:windows下通杀wx小程序云函数实战 ,想着自己也学习一下怎么逆向小程序,一搜 unveilr 仓库没了,看评论好像开始收费了。 我就用aardio写了一个解密和解包工具,这里免…

亚马逊、ebay卖家必读!买家账号关联问题和解决应对方案。

跨境电商卖家最害怕发生的事情之一,就是账号关联了。在多数卖家印象中,平台是不允许一个卖家同时进行多账号操作,一旦被发现就会被强制关停。其实并非如此,平台是允许将不同的亚马逊卖家账号链接在一起,使它们形成一个…

22款奔驰C260L升级原厂360全景影像 高清环绕的视野

360全景影像影像系统提升行车时的便利,不管是新手或是老司机都将是一个不错的配置,无论是在倒车,挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况,避免盲区事故发生,提升行车出入安全性。 360全景影像包含&…

CN考研真题知识点二轮归纳(2)

持续更新,上期目录: CN考研真题知识点二轮归纳(1)https://blog.csdn.net/jsl123x/article/details/134095044?spm1001.2014.3001.5501 1.DCHP 动态主机配置协议,常用于给主机动态分配IP地址,它提供即插即…

IBM Spectrum LSF Session Scheduler(会话调度程序)提高总体集群利用率和系统性能

IBM Spectrum LSF Session Scheduler 提高总体集群利用率和系统性能 LSF Session Scheduler 使用户能够使用作业级任务调度程序在单个 LSF 作业的分配中运行短期任务的大型集合,该调度程序为作业分配一次资源,并对每个任务复用已分配的资源。 LSF Sessi…

css position属性与js滚动

“视口”就是浏览器窗口中实际显示文档内容的区域,不包含浏览器的“外框”,如菜单、工具条和标签。文档则是指整个网页。 1 css 的position static 正常定位,是元素position属性的默认值,元素遵循常规流。 relative 相对定位&…

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)

参考视频:https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7:CNN 的全局架构 卷积层除了做卷积操作外,还要加上 bias ,再经过非线性的函数,这么做的原因是 “scaled p…

SpringCloud 微服务全栈体系(八)

第九章 Docker 二、Docker 的基本操作 1. 镜像操作 1.1 镜像名称 镜像的名称组成: 镜像名称一般分两部分组成:[repository]:[tag]。在没有指定 tag 时,默认是 latest,代表最新版本的镜像 比如:mysql 就是 reposito…

Linux — vim编辑器的操作

目录 1. vim的整体操作2. 命令模式下的常见命令3. 底行模式下的常见命令结语 1. vim的整体操作 我们使用 touch 创建一个文件之后,直接 vim 文件名 就能够进入到vim编辑器中。如果vim 文件名的文件还不存在时,vim会自动创建该文件,但需要保存…

中山大学计算机学院2024届推免拟录取及分析

拟录取名单: 分析 中山大学计算机学院2023年共录取推免生245人,其中 计算机科学与技术(学硕)录取245人,计算机技术(专硕)录取58人,计算数学录取11人。 很明显可以看出,学…

C++笔记-RTTR编译安装简单使用

这里以Linux为例,我使用的机器的gcc版本是4.9.2 使用的RTTR的版本是0.9.5 编译&安装 首先在官网将rttr的0.9.5版本下载下来。 Home |RTTR 按照官方的安装流程: 但这里可能会出现一个问题: 按照解答,切换成root用户&#x…

医学手术麻醉临床信息系统源码

手术麻醉临床信息系统遵循“以病人为中心、服务于临床”的宗旨,使医护人员从繁琐的病历书写中解放出来,集中精力关注病人的诊疗,将更多的时间用于分析、诊断。以服务围术期临床业务工作的开展为核心,为医护人员、业务管理人员、院…

高级工技能等级认定---网络设备安全

目录 一、DHCP 安全配置 二、SSH配置 三、标准ACL的配置 四、配置交换机端口安全 五、三层交换和ACL的配置 一、DHCP 安全配置 配置要求: 1.给交换机配置enable密码. 2.在交换机上创建VLAN 100,将F0/1-3口改为Access口,并加入到VLAN …

【LeetCode刷题-哈希】--706.设计哈希映射

706.设计哈希映射 class MyHashMap {private class Pair{private int key;private int value;public Pair(int key ,int value){this.key key;this.value value;}public int getKey(){return key;}public int getValue(){return value;}public void setValue(int value){this…

Win10安装WSL2和ubuntu

目录 一、win10系统设置 二、安装WSL 三、win10中ubuntu迁移到D盘 四、在vscode中访问ubuntu 在win10中安装WSL2虚拟机,然后安装ubuntu,最后使用vscode连接ubuntu。教程适用于: ubuntu22.04ubuntu20.04ubuntu18.04 一、win10系统设置 …

大型微服务架构智慧工地云平台源码(SaaS模式)

智慧工地云平台建设是采用先进的移动互联、物联网、云计算、大数据等新一代信息技术,主要由信息采集层、网络接入层、网络传输层、信息储存与处理层组成,主要包括云管理平台、综合管理系统、质量管理系统、安全管理系统等模块。施工管理人员可通过PC端&a…

欧姆龙PLC与上位机通讯说明

欧姆龙PLC与上位机连接时一般采用的是Hoslink协议,它是一种简易经济的通讯方式,比较适合一台上位机和一台PLC或者多台PLC进行通讯。上位机可对漂亮C进行程序传送和读写等操作。HOSTLINK系统允许一台上位机通过上位机链接命令向HOSTLINK系统的PLC发送命令…

MyBatis-Plus 实战教程三 拓展插件

文章目录 扩展功能代码生成安装插件使用 静态工具逻辑删除通用枚举定义枚举配置枚举处理器测试 JSON类型处理器定义实体使用类型处理器 仓库地址 扩展功能 代码生成 在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。…

鸿蒙开发第一步-入门

本人安卓开发小趴菜一枚,在现公司做中控产品,目前通过 Java,Kotlin开发,但是随着后面可能会用到华为产品(后续华为可能不支持安卓)做中控设备,所以在领导的建议下,入手鸿蒙开发。 先说下中控产品吧,以pad开…

线扫相机DALSA-相机平场矫正详细步骤

在相机视野下铺放白色亚克力板或纯白纸,采集图像。打开曲线图。 选择 Line Profile 模式。调节好相应所需的曝光时间、光源、增益和镜头光圈,让白平衡纸显示出来的灰度值大概在 150-200 左右。 在Calibration Algorithm 中将显示的数值设置好。 先暗场…