全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

中介者模式的核心思想

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

关键角色:

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

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

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

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

package main

import "fmt"

// Mediator 定义中介者接口 type Mediator interface { SendMessage(message string, sender UserInterface) }

// UserInterface 定义用户接口 type UserInterface interface { Receive(message string) GetName() string }

实现具体中介者:ChatRoom

// ChatRoom 是具体中介者
type ChatRoom struct {
    users []UserInterface
}

func (c *ChatRoom) AddUser(user UserInterface) { c.users = append(c.users, user) }

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

// User 是具体同事,依赖中介者进行通信
type User struct {
    name     string
    mediator Mediator
}

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

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

func (u *User) Send(message string) { u.mediator.SendMessage(message, u) }

func (u *User) Receive(message string) { fmt.Printf("%s 收到消息: %s\n", u.name, message) }

主程序测试

func main() {
    chatRoom := &ChatRoom{}
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 中通过接口和结构体组合,能清晰表达中介者模式的设计意图,让模块协作更灵活可控。


# go  # golang  # app  # ai  # 封装  # 结构体  # 继承  # 接口  # 对象  # 多个  # 我是  # 我也  # 大家好  # 来啦  # 只需  # 聊天室  # 与其他  # 集中控制  # 主程序 


相关文章: 如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  子杰智能建站系统|零代码开发与AI生成SEO优化指南  如何在Windows虚拟主机上快速搭建网站?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何用wdcp快速搭建高效网站?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何快速登录WAP自助建站平台?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  如何基于云服务器快速搭建网站及云盘系统?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  如何快速重置建站主机并恢复默认配置?  购物网站制作公司有哪些,哪个购物网站比较好?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  如何通过西部数码建站助手快速创建专业网站?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  小建面朝正北,A点实际方位是否存在偏差?  济南网站制作的价格,历城一职专官方网站?  如何在云服务器上快速搭建个人网站?  如何在西部数码注册域名并快速搭建网站?  教程网站设计制作软件,怎么创建自己的一个网站?  如何快速生成专业多端适配建站电话?  利用JavaScript实现拖拽改变元素大小  建站之星24小时客服电话如何获取?  如何自定义建站之星模板颜色并下载新样式?  如何在阿里云ECS服务器部署织梦CMS网站?  公司网站的制作公司,企业网站制作基本流程有哪些?  建站之星如何快速生成多端适配网站?  如何通过VPS建站实现广告与增值服务盈利?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  建站主机是否属于云主机类型?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  宝塔面板创建网站无法访问?如何快速排查修复?  建站之星安装模板失败:服务器环境不兼容?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何在Tomcat中配置并部署网站项目?  如何用IIS7快速搭建并优化网站站点?  如何用花生壳三步快速搭建专属网站?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  制作宣传网站的软件,小红书可以宣传网站吗?  如何快速搭建高效服务器建站系统?  测试制作网站有哪些,测试性取向的权威测试或者网站?  IOS倒计时设置UIButton标题title的抖动问题  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  安云自助建站系统如何快速提升SEO排名?  如何在服务器上三步完成建站并提升流量? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。