新闻中心

如何在Golang中实现中介者模式_Golang 中介者模式实践

2025-11-24
浏览次数:
返回列表
中介者模式通过引入中介对象封装对象间交互,降低耦合。在Go中利用接口和组合实现,如聊天室示例中ChatRoom作为中介者管理用户消息转发,User仅持有Mediator接口,发送消息时不直接引用其他用户,从而实现解耦。该模式适用于多组件通信场景,提升代码可维护性和扩展性。

如何在golang中实现中介者模式_golang 中介者模式实践

中介者模式的核心思想是解耦多个对象之间的复杂交互。在 Golang 中,虽然没有类的继承机制,但通过接口和组合依然可以优雅地实现这一行为型设计模式。当多个组件之间相互调用关系混乱时,引入一个“中介者”来统一管理它们的通信,能让代码更清晰、更易维护。

什么是中介者模式

中介者模式(Mediator Pattern)用一个中介对象封装一系列对象之间的交互。它使各对象不需要显式地相互引用,从而降低耦合,并且可以独立地改变它们之间的交互逻辑。

典型应用场景包括:聊天室系统、GUI 组件联动、游戏中的角色与环境交互等。

Go 中的结构设计

Golang 没有传统的类,但我们可以通过结构体和接口模拟角色协作。通常包含以下几部分:

  • Mediator 接口:定义同事对象如何通过中介者通信
  • ConcreteMediator 结构体:实现具体的协调逻辑,持有所有同事的引用
  • Colleague 接口或结构体:每个同事持有对中介者的引用,发送消息时不直接调用其他同事
下面以一个简单的聊天室为例说明。

实例:聊天室中的用户通信

假设有多个用户(User),他们不能直接发消息给彼此,必须通过聊天室(ChatRoom)转发。

定义中介者接口和具体实现:

魔众社区购商城系统 魔众社区购商城系统

现在要说到社区团购模式,相信大家都不陌生,其实社区团购这种模式最初是从长沙开始,目前正向全国各地蔓延开来,这也使得一大批创业者正在如火如荼的想进入到社区团购这个行业中来,经过不断的学习,不断的讨论,慢慢的在心里形成了自己对于社区团购的理解。

魔众社区购商城系统 0 查看详情 魔众社区购商城系统
type Mediator interface {
    Send(message string, sender *User)
}

type ChatRoom struct {
    users []*User
}

func (c *ChatRoom) Register(user *User) {
    c.users = append(c.users, user)
}

func (c *ChatRoom) Send(message string, sender *User) {
    for _, user := range c.users {
        // 不让发送者重复接收自己的消息
        if user != sender {
            user.Receive(message)
        }
    }
}

定义同事对象 User:

type User struct {
    name     string
    mediator Mediator
}

func NewUser(name string, mediator Mediator) *User {
    return &User{
        name:     name,
        mediator: mediator,
    }
}

func (u *User) Send(message string) {
    u.mediator.Send(u.name+": "+message, u)
}

func (u *User) Receive(message string) {
    println(u.name + " received: " + message)
}

使用示例:

func main() {
    chatRoom := &ChatRoom{}
    
    alice := NewUser("Alice", chatRoom)
    bob := NewUser("Bob", chatRoom)
    charlie := NewUser("Charlie", chatRoom)

    chatRoom.Register(alice)
    chatRoom.Register(bob)
    chatRoom.Register(charlie)

    alice.Send("Hi everyone!")   // Bob 和 Charlie 收到
    bob.Send("Hello Alice!")     // Alice 和 Charlie 收到
}

输出结果:

Bob received: Alice: Hi everyone!
Charlie received: Alice: Hi everyone!
Alice received: Bob: Hello Alice!
Charlie received: Bob: Hello Alice!

优势与适用场景

这种写法让 User 之间完全解耦。新增用户或修改分发规则都不影响现有逻辑。适合用于:

  • 多个模块需要通信但不想硬编码依赖
  • 事件总线或消息中心的简化版本
  • 减少网状调用关系,提升可测试性

基本上就这些。Golang 中实现中介者不依赖继承,靠接口和引用传递即可完成,简洁又实用。关键在于把“谁该收到消息”的判断放在中介者中,而不是分散在各个对象里。

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


# 中介者模式  # go  # 编码  # golang  # 网络营销的推广技能  # 丽水外贸网站建设模板  # 肇庆网站优化推广  # 高埗学校网站建设  # seo免费博客霸屏  # 网站推广引流活动方案  # 长乐网页seo介绍公司  # 岳塘区网站营销推广  # 番禺网络营销seo  # 河南靠谱网站优化  # 复用  # 自己的  # 不直接  # 如何实现  # 如何使用  # 都不  # 聊天室  # 如何在  # 团购  # 多个  # ai  # app 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AO3官方可用镜像 Archive of Our Own网页版最新入口  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  BetterDiscord插件中安全更新用户简介的实践指南  必由学官方登录入口 必由学教师学生账号快速访问  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  J*a编写用户注册与登录功能_掌握字符串与验证逻辑  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  steam官方网页快速访问 steam账号注册全流程  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  动漫花园资源网使用步骤_动漫花园资源网下载流程  微信群消息显示延迟如何解决 微信群消息刷新优化方法  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  抓大鹅无需下载版 抓大鹅秒玩版入口  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  Composer如何解决json扩展缺失的错误  age动漫网站入口 age动漫官网直接访问入口  星露谷物语官网入口 星露谷物语游戏官网入口  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  QQ网页版官方账号入口 QQ网页版网页版登录指南  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  Win11怎么开启省电模式_Win11电池节电模式自动开启  机器学习中对数变换预测结果的反向还原  Linux如何构建多环境配置管理_Linux多环境配置方案  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  高德地图怎么看全景照片_高德地图全景照片浏览教程  126邮箱网页版官方入口 126邮箱账号在线登录平台  J*aScript异步迭代器_j*ascript异步遍历  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  C++ vector二维数组定义_C++ vector of vector用法  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  c++项目目录结构应该如何组织_c++工程化项目结构规范  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程 

搜索