如何使用Golang实现中介者模式管理模块交互_Golang中介者模式示例


中介者模式通过引入中介者封装对象交互,降低模块耦合;Golang用接口和组合实现,如ChatRoom协调User间通信,使各模块仅依赖中介者,提升可维护性与扩展性。

如何使用golang实现中介者模式管理模块交互_golang中介者模式示例

在复杂的系统中,多个模块之间如果直接相互调用,会导致耦合度过高,难以维护和扩展。中介者模式通过引入一个“中介者”来封装对象之间的交互逻辑,使各模块不必显式引用彼此,从而降低系统的耦合性。Golang 虽然没有类继承机制,但通过接口和组合完全可以优雅地实现中介者模式。

中介者模式的核心思想

中介者模式将原本分散在多个对象间的交互行为集中到一个中介者对象中处理。各个同事对象(模块)只与中介者通信,而不直接与其他同事通信。这样,新增或修改模块时,只需调整中介者逻辑,不影响其他模块。

关键角色:

  • Mediator(中介者):定义同事间交互的接口。
  • ConcreteMediator(具体中介者):实现协调逻辑,持有所有同事的引用。
  • Colleague(同事):各模块,仅持有中介者引用,通过中介者与其他模块通信。

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

以一个简单的聊天室为例,多个用户(User)发送消息时不直接发给对方,而是通过聊天室(ChatRoom)这个中介者进行转发。

定义中介者接口和同事基类:

package main
<p>import "fmt"</p><p>// Mediator 定义中介者接口
type Mediator interface {
SendMessage(message string, sender UserInterface)
}</p><p>// UserInterface 定义用户接口
type UserInterface interface {
Receive(message string)
GetName() string
}

实现具体中介者:ChatRoom

// ChatRoom 是具体中介者
type ChatRoom struct {
    users []UserInterface
}
<p>func (c *ChatRoom) AddUser(user UserInterface) {
c.users = append(c.users, user)
}</p><p>func (c *ChatRoom) SendMessage(message string, sender UserInterface) {
senderName := sender.GetName()
for _, user := range c.users {
// 不发送给自己
if user.GetName() != senderName {
user.Receive(fmt.Sprintf("[%s]: %s", senderName, message))
}
}
}

实现同事对象:User

《PHP设计模式指南》中文版 《PHP设计模式指南》中文版

《PHP设计模式》首先介绍了设计模式,讲述了设计模式的使用及重要性,并且详细说明了应用设计模式的场合。接下来,本书通过代码示例介绍了许多设计模式。最后,本书通过全面深入的案例分析说明了如何使用设计模式来计划新的应用程序,如何采用PHP语言编写这些模式,以及如何使用书中介绍的设计模式修正和重构已有的代码块。作者采用专业的、便于使用的格式来介绍相关的概念,自学成才的编程人员与经过更多正规培训的编程人员

《PHP设计模式指南》中文版 341 查看详情 《PHP设计模式指南》中文版
// User 是具体同事,依赖中介者进行通信
type User struct {
    name     string
    mediator Mediator
}
<p>func NewUser(name string, mediator Mediator) *User {
return &User{
name:     name,
mediator: mediator,
}
}</p><p>func (u *User) GetName() string {
return u.name
}</p><p>func (u *User) Send(message string) {
u.mediator.SendMessage(message, u)
}</p><p>func (u *User) Receive(message string) {
fmt.Printf("%s 收到消息: %s\n", u.name, message)
}

主程序测试

func main() {
    chatRoom := &ChatRoom{}
<pre class="brush:php;toolbar:false;">user1 := NewUser("Alice", chatRoom)
user2 := NewUser("Bob", chatRoom)
user3 := NewUser("Charlie", chatRoom)

chatRoom.AddUser(user1)
chatRoom.AddUser(user2)
chatRoom.AddUser(user3)

user1.Send("Hello 大家好!")
fmt.Println("---")
user2.Send("Hi Alice,我是 Bob")
fmt.Println("---")
user3.Send("我也来啦!")

}

输出结果:

Alice 收到消息: [Bob]: Hi Alice,我是 Bob
Alice 收到消息: [Charlie]: 我也来啦!
Bob 收到消息: [Alice]: Hello 大家好!
---
Bob 收到消息: [Alice]: Hello 大家好!
Bob 收到消息: [Charlie]: 我也来啦!
---
Charlie 收到消息: [Alice]: Hello 大家好!
Charlie 收到消息: [Bob]: Hi Alice,我是 Bob

适用场景与优势

中介者模式适用于多个对象频繁交互、关系复杂的情况,比如 GUI 组件通信、游戏对象管理、微服务间协调等。

优点:

  • 减少子系统间的依赖,模块更独立。
  • 集中控制交互逻辑,便于调试和扩展。
  • 新增模块只需注册到中介者,无需修改原有代码。

注意事项:

  • 中介者可能变得过于复杂,需合理拆分职责。
  • 过度使用可能导致中介者成为“上帝对象”,应结合实际权衡。

基本上就这些。Golang 中通过接口和结构体组合,能清晰表达中介者模式的设计意图,让模块协作更灵活可控。

以上就是如何使用Golang实现中介者模式管理模块交互_Golang中介者模式示例的详细内容,更多请关注其它相关文章!


# 只需  # 上海专业的网站推广公司  # 网络营销的游戏推广行业  # 搜狗流量seo案例分享  # 丰县网站推广报价  # trswcm网站建设  # 关键词seo排名金手指下拉三  # js网站跳转推广  # 广州市seo入门  # 李沧区网络推广营销公司  # 镇江网站建设地点  # 管理模块  # go  # 本书  # 来啦  # 器中  # 大家好  # 我也  # 我是  # 如何使用  # 多个  # ai  # app  # golang 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 泰拉瑞亚水晶无法放置问题  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  《虎扑》取消评分记录方法  《洛克王国:世界》国家队搭配攻略  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  海棠阅读登录教程_详细讲解海棠登录操作  C++ switch case字符串_C++如何实现字符串switch匹配  抖音团长模式怎么做?团长模式是什么意思?  知音漫客官网首页入口_知音漫客热门漫画推荐  在Django单元测试中优雅处理信号:基于环境的条件执行策略  Excel宏怎么删除_Excel中删除宏的详细操作流程  Go Goroutine调度与并发执行深度解析  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  怎么恢复删除的电脑文件_数据恢复软件使用教程  《淘票票》添加到苹果钱包教程  《360浏览器》自动保存账号密码设置方法  顺丰官方查单号入口 顺丰快递单号查询官网入口  12306夜间购票失败? | 查看官方公布的暂停服务公告与应对方案  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  J*aScript二进制处理_ArrayBuffer与Blob  苹果11如何更换iCloud账号_苹果11账号切换的具体步骤  申通快件单号查询平台 申通包裹物流动态跟踪  以下哪一项是古代兵书三十六计中的计谋  《大周列国志》皇帝律令功能介绍  在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  《绝区零》2.3前瞻|直播|内容介绍  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  Go App Engine 项目结构与包管理深度指南  微信网页版在线登录 微信网页版在线使用入口  《下一站江湖2》独孤剑诀习得方法  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角  除了Copilot,还有哪些值得一试的VS Code AI插件?  《小黑盒》删除历史浏览方法  火柴人战争网页版在线玩  4399造梦西游3无敌版_4399游戏入口  鲁班大师乓乓皮肤获取方法  《气泡星球》兑换码礼包大全  J*aScript桌面应用_Electron多进程架构实战  顺丰快递怎么查物流_顺丰快递物流信息实时查询操作指南  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  优化Flask模板中SQLAlchemy查询迭代标签:处理字符串空格问题  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  苹果官网国补入口在哪  教资成绩怎么查询 

 2025-12-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.