[go] 中介者模式

设计模式

中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。

模型说明

  1. 组件(Component)是各种包含业务逻辑的类。每个组件都有一个指向中介者的引用,该引用被声明为中介者接口类型。组件不知道中介者实际所属的类,因此你可通过将其连接到不同的中介者以使其能在其他程序中复用。

  2. 中介者(Mediator)接口声明了与组件交流的方法,但通常仅包括一个通知方法。组件可将任意上下文(包括自己的对象)作为该方法的参数,只有这样接收组件和发送者类之间才不会耦合。

  3. 具体中介者(Concrete Mediator)封装了多种组件间的关系。具体中介者通常会保存所有组件的引用并对其进行管理,甚至有时会对其生命周期进行管理。

  4. 组件并不知道其他组件的情况。如果组件内发生了重要事件,它只能通知中介者。中介者收到通知后能轻易地确定发送者,这或许已足以判断接下来需要触发的组件了。

  • 对于组件来说,中介者看上去完全就是一个黑箱。发送者不知道最终会由谁来处理自己的请求,接收者也不知道最初是谁发出了请求。

优缺点

1.优点

  • 单一职责原则:你可以将多个组件间的交流抽取到同一位置,使其更易于理解和维护。
  • 开闭原则:你无需修改实际组件就能增加新的中介者。
  • 你可以减轻应用中多个组件间的耦合情况。
  • 你可以更方便地复用各个组件。

2.缺点

  • 一段时间后,中介者可能会演化成为上帝对象

使用场景

  • 当一些对象和其他对象紧密耦合以致难以对其进行修改时,可使用中介者模式。
  • 当组件因过于依赖其他组件而无法在不同应用中复用时,可使用中介者模式。
  • 如果为了能在不同情景下复用一些基本行为,导致你需要被迫创建大量组件子类时,可使用中介者模式。

参考代码

火车站交通系统。 两列火车互相之间从来不会就站台的空闲状态进行通信。
train.go: 组件

package main

type Train interface {
    arrive()
    depart()
    permitArrival()
}

passengerTrain.go: 具体组件

package main

import "fmt"

type PassengerTrain struct {
    mediator Mediator
}

func (g *PassengerTrain) arrive() {
    if !g.mediator.canArrive(g) {
        fmt.Println("PassengerTrain: Arrival blocked, waiting")
        return
    }
    fmt.Println("PassengerTrain: Arrived")
}

func (g *PassengerTrain) depart() {
    fmt.Println("PassengerTrain: Leaving")
    g.mediator.notifyAboutDeparture()
}

func (g *PassengerTrain) permitArrival() {
    fmt.Println("PassengerTrain: Arrival permitted, arriving")
    g.arrive()
}


freightTrain.go: 具体组件

package main

import "fmt"

type FreightTrain struct {
    mediator Mediator
}

func (g *FreightTrain) arrive() {
    if !g.mediator.canArrive(g) {
        fmt.Println("FreightTrain: Arrival blocked, waiting")
        return
    }
    fmt.Println("FreightTrain: Arrived")
}

func (g *FreightTrain) depart() {
    fmt.Println("FreightTrain: Leaving")
    g.mediator.notifyAboutDeparture()
}

func (g *FreightTrain) permitArrival() {
    fmt.Println("FreightTrain: Arrival permitted")
    g.arrive()
}


mediator.go: 中介者接口

package main

type Mediator interface {
    canArrive(Train) bool
    notifyAboutDeparture()
}

stationManager.go: 具体中介者

package main

type StationManager struct {
    isPlatformFree bool
    trainQueue     []Train
}

func newStationManger() *StationManager {
    return &StationManager{
        isPlatformFree: true,
    }
}

func (s *StationManager) canArrive(t Train) bool {
    if s.isPlatformFree {
        s.isPlatformFree = false
        return true
    }
    s.trainQueue = append(s.trainQueue, t)
    return false
}

func (s *StationManager) notifyAboutDeparture() {
    if !s.isPlatformFree {
        s.isPlatformFree = true
    }
    if len(s.trainQueue) > 0 {
        firstTrainInQueue := s.trainQueue[0]
        s.trainQueue = s.trainQueue[1:]
        firstTrainInQueue.permitArrival()
    }
}

main.go: 客户端代码

package main

func main() {
    stationManager := newStationManger()

    passengerTrain := &PassengerTrain{
        mediator: stationManager,
    }
    freightTrain := &FreightTrain{
        mediator: stationManager,
    }

    passengerTrain.arrive()
    freightTrain.arrive()
    passengerTrain.depart()
}

output:

PassengerTrain: Arrived
FreightTrain: Arrival blocked, waiting
PassengerTrain: Leaving
FreightTrain: Arrival permitted
FreightTrain: Arrived

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

调优 mybatis saveBatch 25倍性能

调优 mybatis saveBatch 25倍性能 最近在压测一批接口,发现接口处理速度慢的有点超出预期,感觉很奇怪,后面定位发现是数据库批量保存这块很慢。 这个项目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch…

Geogebra绘制正态分布曲线-学习b站何威老师视频

​ 参考资料 GeoGebra系列教程3——GGB与正态分布密度曲线_哔哩哔哩_bilibili 我要开始学习啦,吼吼~~~ 准备工作 https://www.geogebra.org/download 选择GeoGebra 经典 6 详细步骤 设计思路具体操作设计积分区间【a,b】创建滑动条a∈[-5,5],增量是…

P4学习(七)实验四:Explicit Congestion Notification

目录 一. 实验目的二.前置知识略概三. 实验过程1. Topo2. Egress 三. 实验结果1.启动监听服务端2.发送数据包3.查看h2.log的数据4.Iperf模拟Flood超过门限 四.为什么要在Egress上进行ecn的配置 一. 实验目的 ECN allows end-to-end notification of network congestion without…

Android SeekBar 进度条圆角

先看下效果图&#xff1a; 之前&#xff1a; 优化后&#xff1a; 之前的不是圆角是clip切割导致的 全代码&#xff1a; <SeekBarandroid:layout_width"188dp"android:layout_height"wrap_content"android:background"null"android:focusa…

专门为机器学习开发的jpy语言

这本来是一个为工科教学专门开发的附属品&#xff0c;并不是说Python或Java有多不好&#xff0c;根本上它就是一个Java工程教材&#xff0c;但又要结合人工智能。因此&#xff0c;出现了这样一个包容性的怪胎&#xff0c;可以用python一样的语法与Java一起编写。 没流行起来的一…

一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具 使用场景代码使用截图打包好的软件下载链接结尾 使用场景 有时我们在借鉴一篇文档之后还不想有太多重复&#xff0c;这个时候可以使用这个工具对两个word文档进行对比 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWind…

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

手上 ROC-RK3399-PC Pro 使用蓝牙 WIFI 模组是 AP6256。 一、AP6256 模组介绍 AP6256是正基科技(AMPAK)推出的一款低成本、低功耗的双模模块,它集成了Wi-Fi和蓝牙功能。这款模块支持SDIO接口,具有以下特点: 1、型号:AP6256 2、接口:SDIO(Secure Digital Input/Outp…

搜维尔科技:【简报】元宇宙数字人赛道,优秀作品赏析《大福太郎》

这次采用亮眼的浅粉做为发色&#xff0c;为了贴合她小警察的身分 给了她一顶特制的警帽&#xff0c;上面有大福的荧光蓝叶片作为标 志&#xff0c;而在配件及裙子上也加入了许多科技元素的小巧思。 学校&#xff1a; 朝阳科技大学&#xff08;台湾&#xff09; 选手&#xff…

排序算法经典模型: 梯度提升决策树(GBDT)的应用实战

目录 一、Boosting训练与预测 二、梯度增强的思想核心 三、如何构造弱学习器和加权平均的权重 四、损失函数 五、梯度增强决策树 六、GBDT生成新特征 主要思想 构造流程 七、梯度增强决策树以及在搜索的应用 7.1 GDBT模型调参 7.1.1 框架层面参数 n_estimators su…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1(附项目源码)

本篇最终效果演示 文章目录 本篇最终效果演示系列目录前言环境素材绘制地形 实现人物移动指示显示物品名称源码完结 系列目录 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1&#xff08;附项目源码&#xff09; 【制作100个unity游戏之23】实现类似七日杀、森…

申万宏源基于 StarRocks 构建实时数仓

作者 &#xff1a;申万宏源证券 实时数仓项目组 小编导读&#xff1a; 申万宏源证券有限公司是由新中国第一家股份制证券公司——申银万国证券股份有限公司与国内资本市场第一家上市证券公司——宏源证券股份有限公司&#xff0c;于 2015 年 1 月 16 日合并组建而成&#xff0c…

【若依】关于对象查询list返回,进行业务处理以后的分页问题

1、查询对象Jglkq返回 list&#xff0c;对 list 进行业务处理后返回&#xff0c;但分页出现问题。 /*** 嫁功率考勤查询*/RequiresPermissions("hr:kq:list")PostMapping("/list")ResponseBodypublic TableDataInfo list(Jglkq jglkq) throws ParseExcepti…

简单高效 Learn LaTeX 009 - LaTex Cite Notes (30 mins) 引用与注释

这一集里介绍了对文献引用的表示方法&#xff0c;和添加注释文本的方法&#xff1a; https://www.ixigua.com/7298100920137548288?id7304342671428944403&logTag495628805c8329a41ffa

JVM系列-6.java垃圾回收

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

PyTorch深度学习实战(32)——DCGAN详解与实现

PyTorch深度学习实战&#xff08;32&#xff09;——DCGAN详解与实现 0. 前言1. 模型与数据集分析1.1 模型分析1.2 数据集介绍 2. 构建 DCGAN 生成人脸图像小结系列链接 0. 前言 DCGAN (Deep Convolutional Generative Adversarial Networks) 是基于生成对抗网络 (Convolution…

香港代理IP为何受欢迎?

香港代理IP深受用户欢迎的原因主要有以下几点&#xff1a; 1&#xff0c;地理位置优势&#xff1a;香港位于亚洲的中心地带&#xff0c;与中国大陆、东南亚和其他亚洲国家都有良好的网络连接。这使得使用香港代理IP可以实现较快的网络连接速度和较低的延迟&#xff0c;特别是对…

架构篇24:排除架构可用性隐患的利器-FMEA方法

文章目录 FMEA 介绍FMEA 方法FMEA 实战小结 前面的专栏分析高可用复杂度的时候提出了一个问题&#xff1a;高可用和高性能哪个更复杂&#xff0c;根据墨菲定律“可能出错的事情最终都会出错”&#xff0c;架构隐患总有一天会导致系统故障。因此&#xff0c;我们在进行架构设计的…

shopee的AI学习之路——GPTs通过AdInteli 广告变现

GPTs|AdInteli 广告变现 一、什么是 AdInteli AdIntelli 是一个旨在为生成 GPTs 接入广告并实现变现的平台。它连接了全球最大的广告联盟&#xff0c;允许广告商进行竞价&#xff0c;确保展示最有价值的广告。AdIntelli 采用 AI 驱动的收入生成技术&#xff0c;优化广告选择。…

【github】使用github action 拉取国外docker镜像

使用github action 拉取国外docker镜像 k8s部署经常用到国外镜像&#xff0c;如果本地无法拉取可以考虑使用github action环境 github action的ci服务器在国外&#xff0c;不受中国防火墙影响github action 自带docker命令运行时直接将你仓库代码拉取下来 步骤 你的国内dock…

SAP PO平台配置

多个系统分配 &#xff1a; XPATH : /p1:mt_ERP_ZSSF_HFM_001/sapClient SPACE : p1 http://lstech.com/erp/IF0523/ZSSF_HFM_001
最新文章