如何在Golang中实现中介者模式_Golang中介者模式实现方法汇总

中介者模式通过封装对象交互降低耦合,Go中常用接口与结构体组合实现;示例包含基础同步通信、基于channel的异步中介及泛型事件总线,适用于GUI、游戏开发与微服务协调。

如何在golang中实现中介者模式_golang中介者模式实现方法汇总

在Go语言中实现中介者模式,核心是通过一个中介者对象来封装一系列对象之间的交互,避免对象之间直接引用,降低耦合度。以下是几种常见的Golang中介者模式实现方法,适用于不同场景。

1. 基础结构体与接口实现

定义中介者接口和同事接口,通过结构体组合实现解耦通信。

示例代码:

先定义两个接口:

Mediator 接口:负责处理同事之间的消息转发。

立即学习“go语言免费学习笔记(深入)”;

Colleague 接口:表示参与交互的对象,持有中介者引用。

实现方式如下:

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

type Colleague interface {Receive(message string)}

type ConcreteMediator struct {ColleagueA UserAColleagueB UserB}

func (m *ConcreteMediator) Send(message string, sender Colleague) {if sender == m.ColleagueA {m.ColleagueB.Receive(message)} else {m.ColleagueA.Receive(message)}}

type UserA struct {mediator Mediator}

func (u *UserA) Send(msg string) {u.mediator.Send(msg, u)}

func (u *UserA) Receive(msg string) {println("UserA received:", msg)}

// UserB 实现类似 UserAtype UserB struct {mediator Mediator}

func (u *UserB) Send(msg string) {u.mediator.Send(msg, u)}

func (u *UserB) Receive(msg string) {println("UserB received:", msg)}

使用方式:

mediator := &ConcreteMediator{}a := &UserA{mediator: mediator}b := &UserB{mediator: mediator}mediator.ColleagueA = amediator.ColleagueB = b

a.Send("Hello from A") // 输出:UserB received: Hello from Ab.Send("Hi from B") // 输出:UserA received: Hi from B

2. 使用通道(Channel)实现异步中介者

在并发场景下,可用 channel 作为消息队列,由中介者统一调度,实现松耦合、异步通信。

适合多个组件间事件通知、状态广播等场景。

实现思路:定义消息结构体,包含内容和发送者标识中介者监听 channel,根据类型转发消息各同事通过 channel 发送消息给中介者

示例片段:

type Message struct {    Content string    From    string}

type AsyncMediator struct {messages chan Message}

func NewAsyncMediator() *AsyncMediator {m := &AsyncMediator{messages: make(chan Message, 10)}go m.Start()return m}

func (m *AsyncMediator) Start() {for msg := range m.messages {if msg.From == "A" {println("Forwarding to B:", msg.Content)// 模拟发给 B} else {println("Forwarding to A:", msg.Content)}}}

func (m *AsyncMediator) Send(msg Message) {m.messages <- msg}

3. 泛型增强的中介者(Go 1.18+)

利用泛型可以让中介者支持不同类型的消息或同事,提升复用性。

例如定义一个通用事件总线:

type EventHandler[T any] func(T)

type EventBus struct {handlers map[string][]interface{}}

func (e *EventBus) Subscribe[T any](event string, handler EventHandler[T]) {// 订阅逻辑}

func (e *EventBus) Publish(event string, data interface{}) {// 触发对应事件}

这种模式更接近“发布-订阅”,但可视为中介者的一种扩展形式,尤其适合复杂系统中的模块通信。

4. 实际应用场景建议

中介者模式常用于以下场景:

GUI组件通信:按钮、输入框、状态栏之间的联动游戏开发:角色、UI、音效系统间的协调微服务中间层:统一处理服务间调用逻辑

在Go中,由于没有继承机制,更多依赖组合与接口,因此中介者通常以结构体字段方式注入同事对象,保持轻量。

基本上就这些。根据项目复杂度选择合适实现方式,简单场景用接口+结构体即可,高并发考虑 channel,大型系统可结合依赖注入优化管理。

以上就是如何在Golang中实现中介者模式_Golang中介者模式实现方法汇总的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1422102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月16日 16:34:10
下一篇 2025年12月16日 16:34:24

相关推荐

  • 从io.Reader读取UTF-8编码字符串的Go语言指南

    本文旨在深入探讨go语言中处理utf-8编码字符串的机制,特别是在从`io.reader`接口读取数据时的实践。我们将详细解释go的`rune`、`byte`和`string`类型,以及它们与utf-8编码的关系。文章将提供将字节切片转换为utf-8字符串的标准方法,并讨论性能优化策略,包括字节切片…

    2025年12月16日
    000
  • 如何在Vim中启用Go语言自动补全的持久化提示

    本文详细介绍了如何在Vim中配置Go语言自动补全,以实现函数签名和参数类型信息的持久化显示。通过深入解析Vim的completeopt选项以及主流自动补全插件(如autocomplpop和neocomplete)的配置方法,旨在帮助开发者在编码过程中持续获取关键上下文信息,从而提升开发效率,避免频繁…

    2025年12月16日
    000
  • Go语言函数:定义无返回值函数的正确实践

    在go语言中,当函数不需要返回任何值时,无需显式声明返回类型或使用`nil`作为返回值。go语言允许开发者直接省略函数签名中的返回类型部分,从而清晰地表达函数只执行操作而不产生结果的设计意图,简化了代码并避免了不必要的`return`语句。 在Go语言的编程实践中,我们经常会遇到一些函数,它们的主要…

    2025年12月16日
    000
  • Go语言中遍历并修改数组或切片元素:理解range的引用行为

    在go语言中,`for…range`循环在遍历数组或切片时,默认返回的是元素的“副本”而非原始元素的引用。这意味着直接在循环体内修改`range`返回的元素变量,并不会影响到原数组或切片中的对应元素。若需修改原始数据,正确的做法是利用`range`返回的索引来直接访问并修改数组或切片中特…

    2025年12月16日
    000
  • Golang如何搭建基础的投票系统

    答案:使用Golang标准库可快速搭建基于内存的投票系统,支持创建投票、提交选项和查看结果。1. 定义Poll和Option结构体并用map存储;2. 通过net/http实现路由处理:GET/POST /polls用于列表和创建,GET /poll/{id}查看详情,POST /poll/vote…

    2025年12月16日
    000
  • 如何在Golang中搭建高效开发环境_Golang开发环境优化与搭建完整指南

    高效Go开发环境需合理配置工具链与编辑器支持。首选VS Code+Go插件,自动集成gopls、dlv等工具;新项目使用Go Modules管理依赖,执行go mod init初始化;配合gofmt、go vet、revive等工具保障代码质量;通过air实现热重载,结合Makefile自动化构建测…

    2025年12月16日
    000
  • Go CGO调用C可变参数函数:跨平台shm_open的解决方案

    在使用go的cgo与c语言交互时,遇到c语言函数签名在不同平台(如macos的`shm_open`)表现为可变参数,而go期望固定参数时,会引发编译错误。本文将详细介绍如何通过在cgo注释块中定义一个c语言包装函数,来优雅地解决go与c可变参数函数之间的兼容性问题,确保跨平台调用的正确性与稳定性。 …

    2025年12月16日
    000
  • Golang如何实现函数闭包与变量捕获_Golang闭包变量捕获使用详解

    闭包是引用外部变量的函数,Go中通过匿名函数实现,捕获的是变量引用而非值,多个闭包可共享同一变量。示例中outer返回的inner函数捕获了x,即使outer执行完毕仍能访问x。循环中常见陷阱:所有闭包共享同一个循环变量i,导致输出均为3,解决方法是在每次迭代中使用i := i创建局部副本。闭包广泛…

    2025年12月16日
    000
  • 如何在Golang中传递指针给函数

    传指针可修改原始变量值,Go中用&取地址、解引用,函数参数声明为Type以接收指针,结构体等大型数据常用指针传递以提升性能并避免复制。 在Go语言中,传递指针给函数可以让你修改原始变量的值,而不是操作它的副本。Go默认使用值传递,也就是说函数接收到的是变量的拷贝。如果你希望函数能修改调用者的…

    2025年12月16日
    000
  • Golang如何模拟文件IO进行测试

    通过接口抽象和依赖注入实现Go文件IO测试,使用io.Reader等接口接收数据源,结合strings.NewReader模拟输入,避免真实文件读写;必要时用os.CreateTemp创建临时文件进行集成测试。 在Go语言中,为了对文件IO操作进行测试,通常需要避免直接读写真实文件。这样做可以让测试…

    2025年12月16日
    000
  • Golang如何处理函数嵌套与匿名函数_Golang函数嵌套匿名函数使用详解

    Go语言通过匿名函数实现类似函数嵌套的功能,支持闭包、回调和立即执行。1. 匿名函数可赋值给变量或直接调用;2. 可捕获外部变量形成闭包,如计数器示例;3. 在函数内定义局部逻辑块,提升封装性;4. 作为高阶函数参数或返回值,用于映射等操作。 Go语言虽然不支持传统意义上的函数嵌套(即在函数内部定义…

    2025年12月16日
    000
  • Golang如何使用error接口定义自定义错误_Golang自定义错误类型实现技巧

    自定义错误类型可通过实现error接口携带上下文信息,如错误码、时间戳等,并支持通过类型断言、errors.As和errors.Is进行精确匹配与包装处理,提升错误处理的灵活性与可靠性。 在Go语言中,error 是一个内置接口,定义如下: type error interface {    Err…

    2025年12月16日
    000
  • 如何在Golang中管理大量goroutine_Golang大量goroutine管理方法汇总

    使用channel限流可控制goroutine数量,通过带缓冲channel作为信号量,每启动一个goroutine需获取令牌,完成任务后归还,从而限制并发数。 在Go语言中,goroutine是实现并发的核心机制。它轻量、创建成本低,但若不加控制地启动大量goroutine,容易导致内存暴涨、调度…

    2025年12月16日
    000
  • 如何在Golang中测试channel通信正确性

    测试Go中channel通信需验证数据收发及关闭状态,使用select加超时避免阻塞,通过接收第二个布尔值确认channel是否关闭。 测试 Go 中 channel 的通信正确性,关键在于验证数据是否按预期发送、接收,以及 channel 是否正确关闭。由于 channel 常用于并发场景,测试时…

    2025年12月16日
    000
  • Golang如何实现并发安全的消息队列_Golang消息队列并发安全实践详解

    使用channel实现并发安全消息队列,通过带缓冲channel如queue := make(chan string, 10)支持生产者-消费者模型,无需额外锁机制。 在Go语言中实现并发安全的消息队列,核心思路是利用Go内置的并发机制来避免多个goroutine同时操作共享数据时出现竞争。最常用且…

    2025年12月16日
    000
  • Golang如何在Mac系统中配置开发环境_Golang开发环境搭建详细教程

    答案:在Mac上配置Go开发环境需下载对应芯片的安装包并按向导安装,验证go version与go env确保正确配置,创建模块项目并编写main.go测试运行,推荐使用VS Code配合官方Go插件获得完整开发功能,国内用户可设置GOPROXY=https://goproxy.cn加速依赖下载。 …

    2025年12月16日
    000
  • 如何在Golang中实现微服务故障降级_Golang微服务故障降级方法汇总

    使用熔断器防止雪崩,通过sony/gobreaker库在失败率超阈值时自动阻断请求,返回默认值;2. 设置超时与context控制,避免长时间阻塞;3. 利用本地缓存或默认值降级,保障服务可用性;4. 结合限流与降级,使用rate库限制请求速率,防止系统过载。 微服务架构中,服务之间依赖复杂,一旦某…

    2025年12月16日
    000
  • 深入理解Go语言嵌入:方法与宿主结构体字段的访问机制

    Go语言中,嵌入类型的方法接收者是嵌入类型本身,而非其宿主(embedding)结构体。这意味着嵌入方法无法直接访问宿主结构体的非嵌入字段。若需实现类似功能,可考虑在嵌入类型中引入一个接口字段来引用宿主,但这会增加复杂性。更推荐的设计模式是采用 `db.Save(user)` 形式的函数式API,以…

    2025年12月16日
    000
  • Golang通道深度解析:理解ok返回值、缓冲机制与并发实践

    本文深入探讨golang通道的核心机制,包括`ok`返回值在通道关闭后的行为、缓冲通道与非缓冲通道的区别,以及在并发场景下协程(goroutine)的必要性。通过分析示例代码,我们将理解通道在不同状态下的读写特性,以及如何有效利用缓冲和协程来构建健壮的并发程序,避免死锁。 Golang通道基础与并发…

    2025年12月16日
    000
  • Go语言函数返回值详解:解决‘missing return’编译错误

    本文深入探讨go语言函数返回值机制,重点解析在条件语句中可能出现的“missing return at end of function”编译错误。我们将通过具体代码示例,阐明go编译器对所有执行路径返回值的严格要求,并提供确保函数正确返回的解决方案与最佳实践,帮助开发者编写更健壮的go代码。 Go语…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信