信息发布→ 登录 注册 退出

如何在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 中介者模式实践的详细内容,更多请关注其它相关文章!


相关文章: mysql备份恢复性能优化_mysql备份恢复性能优化方法  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  照顾宝贝2小游戏点击立即在线玩  2026春节假期票务安排_2026春节放假购票指南  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  Pyrogram与g4f集成:异步编程实践与常见错误解决  J*aScript实现单选按钮与关联输入框的联动禁用教程  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  4399免费游戏网址入口 4399小游戏免费入口点开即玩  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  css链接悬停下划线样式如何自定义_使用::after结合content和transition  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  Excel文件在线转换快速入口 Excel在线格式转换网站  在命令行怎么运行html项目_命令行运行html项目方法【教程】  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  漫蛙网页登录入口 漫蛙漫画官方授权网址  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  微信商城在哪里打开【步骤】  千牛数据看板网页版_千牛数据看板网页版访问方法  J*aScript中赋值与自增运算符的复杂交互与执行机制  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  Python字典中优雅地迭代剩余元素的方法  age动漫网站入口 age动漫官网直接访问入口  TikTok网页版直接登录 TikTok网页端官方平台入口  抖音网页版平台入口 抖音网页版官网在线访问教程  汽车之家官方网站官网入口_汽车之家网页版直接进入  Composer如何解决json扩展缺失的错误  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Go语言JSON解析深度指南:动态访问与结构体映射实践  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  如何将HTML表格多行数据保存到Google Sheet  J*aScript生成器_j*ascript异步迭代  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  限制HTML日期输入框的日期选择范围  在Pyomo中实现基于变量的条件约束:Big-M方法详解  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!