讲师中心 微信公众号
AI工具推荐 视频效率加速

Golang如何实现中介者模式解耦对象交互_Golang 中介者模式应用实践

冬芳酱_6965

冬芳酱_6965

发布时间:2025-11-24 21:56:02

|

909人浏览过

|

来源于php中文网

原创

中介者模式通过引入中介者对象集中管理组件交互,实现解耦。在Golang聊天室示例中,用户通过ChatServer发送消息,避免直接引用其他用户,降低耦合,提升可维护性。1. 中介者(ChatMediator)定义通信接口;2. 具体中介者(ChatServer)管理用户并转发消息;3. 同事类(User)通过中介者收发消息,不直接通信。该模式适用于聊天系统、UI联动等场景,但需防中介者过度膨胀。

golang如何实现中介者模式解耦对象交互_golang 中介者模式应用实践

在复杂系统中,多个对象之间直接通信会导致高度耦合,难以维护和扩展。Golang 中通过中介者模式(Mediator Pattern)可以有效解耦对象间的交互逻辑。该模式的核心思想是引入一个“中介者”对象,集中处理对象之间的通信,让各个组件不再相互引用,而是通过中介者进行消息传递。

中介者模式的基本结构

中介者模式包含以下几个关键角色:

  • Mediator(中介者):定义统一接口,用于各组件之间的通信协调。
  • ConcreteMediator(具体中介者):实现中介者接口,管理多个组件实例,并协调它们的交互。
  • Colleague(同事类 / 组件):每个组件持有对中介者的引用,不直接与其他组件通信,而是通过中介者发送和接收消息。

这种结构特别适用于如聊天室、UI组件联动、游戏对象交互等场景。

用 Golang 实现一个聊天室示例

假设我们正在构建一个简单的多人聊天室,用户(User)不能直接向其他用户发送消息,必须通过聊天服务器(ChatServer)中转。这就是典型的中介者应用场景。

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

package main

// Mediator interface
type ChatMediator interface {
    SendMessage(message string, user User)
}

// ConcreteMediator
type ChatServer struct {
    users []User
}

func (c *ChatServer) AddUser(user User) {
    c.users = append(c.users, user)
}

func (c *ChatServer) SendMessage(message string, sender User) {
    for _, user := range c.users {
        // 不向发送者自己转发消息
        if user.GetName() != sender.GetName() {
            user.Receive(message)
        }
    }
}

// Colleague interface
type User interface {
    GetName() string
    Send(message string)
    Receive(message string)
}

// Concrete colleague
type ChatUser struct {
    name     string
    mediator ChatMediator
}

func NewChatUser(name string, mediator ChatMediator) *ChatUser {
    return &ChatUser{
        name:     name,
        mediator: mediator,
    }
}

func (u *ChatUser) GetName() string {
    return u.name
}

func (u *ChatUser) Send(message string) {
    println(u.name + " 发送消息: " + message)
    u.mediator.SendMessage(message, u)
}

func (u *ChatUser) Receive(message string) {
    println(u.name + " 收到消息: " + message)
}

// 示例使用
func main() {
    server := &ChatServer{}

    alice := NewChatUser("Alice", server)
    bob := NewChatUser("Bob", server)
    charlie := NewChatUser("Charlie", server)

    server.AddUser(alice)
    server.AddUser(bob)
    server.AddUser(charlie)

    alice.Send("大家好,我是 Alice!")
    bob.Send("Hi,我是 Bob。")
}

运行结果会显示每个用户发送的消息被其他用户接收,但用户之间没有直接依赖。所有通信都由 ChatServer 统一调度。

Golang Uber Dig
Golang Uber Dig

使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等

下载

中介者模式的优势与适用场景

使用中介者模式后,系统具备更高的灵活性和可维护性:

  • 组件之间无需知道彼此存在,降低耦合度。
  • 新增用户或修改通信规则只需调整中介者,不影响已有组件。
  • 便于测试,可以单独测试某个 User 或 Mock Mediator。

常见适用场景包括:

  • 多玩家在线游戏中的事件广播系统。
  • GUI 界面中按钮、输入框、下拉菜单之间的联动控制。
  • 微服务架构中服务注册与消息路由中心的简化模拟。

注意事项与潜在问题

虽然中介者模式能解耦,但也可能带来新的问题:

  • 中介者本身容易变得庞大复杂,变成“上帝对象”,需注意职责划分。
  • 过度使用可能导致通信流程不透明,调试困难。
  • 同步处理消息可能影响性能,必要时可结合异步通道(channel)优化。

在 Golang 中,可以通过 goroutine + channel 进一步增强中介者的并发处理能力。例如,将消息投递放入 goroutine 异步执行,避免阻塞发送方。

基本上就这些。中介者模式不是万能钥匙,但在需要集中控制交互逻辑的场景下,它能让代码更清晰、更易扩展。Golang 的简洁语法和接口设计让这种模式实现起来非常自然。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

519

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

616

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1196

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

791

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1746

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4974

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

2294

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

4166

2025.06.17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn