全网整合营销服务商

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

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

如何使用Golang实现中介者对象通信_使用Mediator Pattern协调对象

Go实现中介者模式的核心是通过接口+结构体组合+闭包,将对象间直接依赖转为对中介者接口的依赖;定义Mediator接口和同事结构体,同事持有中介者接口引用,通过Notify通信,中介者根据sender类型协调行为,避免循环引用,并注意职责边界、生命周期与并发安全。

用 Go 实现中介者模式,核心是把对象间的直接依赖转为对一个中介者接口的依赖,让对象只跟中介者通信,不互相引用。Go 没有类和继承,但靠接口 + 结构体组合 + 闭包,能干净地表达这一思想。

定义中介者接口和同事抽象

先设计一个通用的中介者接口,以及同事(Colleague)需实现的行为:

  • Mediator 接口声明协调方法,比如 Notify(sender interface{}, event string, data interface{})
  • 同事不继承基类,而是通过字段持有 Mediator 实例,并在需要交互时调用其 Notify
  • 实际中,sender 可以是具体类型指针(如 *Button),方便中介者做差异化处理

实现具体中介者与同事结构体

例如做一个简单的 UI 组件协调器:

  • 定义 ButtonTextBox 两个同事结构体,都嵌入一个 mediator Mediator 字段
  • Button.Click() 不直接操作 TextBox,而是调用 m.mediator.Notify(m, "click", nil)
  • 中介者实现里判断 sender 类型:如果是 *Button,就调用 textBox.Clear() 或更新其内容
  • 避免循环引用:中介者持同事指针,同事持中介者接口,不持具体实现类型

用函数式风格简化中介逻辑(可选)

Go 中也可用闭包替代结构体中介者,适合轻量场景:

  • 声明 type MediatorFunc func(sender interface{}, event string, data interface{})
  • 创建闭包封装协调逻辑:mediator := func(s interface{}, e string, d interface{}) { ... }
  • 同事初始化时传入该函数,调用方式不变,但更灵活、无类型膨胀
  • 适合配置驱动或规则简单的情况,比如日志转发、状态广播等

注意解耦边界与生命周期管理

中介者模式容易变成“上帝对象”,需主动约束:

  • 每个中介者只负责一个明确职责域(如 “登录流程协调器”、“表单验证协调器”),不要堆砌功能
  • 同事对象销毁前,建议清空对中介者的引用(尤其在长生命周期中介者+短生命周期同事场景下)
  • 若需事件过滤,可在 Notify 前加简单字符串匹配或用 map[string]func(...) 分发,避免大 switch
  • 并发安全:如果同事在 goroutine 中调用 Notify,中介者内部需自行同步(如加锁或用 channel 串行化)

基本上就这些。Go 的中介者模式不靠语法糖,而靠清晰的责任划分和显式的依赖注入——把“谁通知谁”变成“谁告诉中介者,中介者决定怎么转达”。写起来不复杂,但容易忽略边界控制,反而加重耦合。


# go  # golang  # switch  # String  # 封装  # 表单验证  # 字符串  # 结构体  # 无类型  # 循环  # 指针  # 继承  # 接口  #   # Interface  # Event  # 闭包  # nil  # map  # 并发  # channel  # 对象  # 事件  # ui  # 或用  # 这一  # 并在  # 可在  # 做一个  # 可选  # 中也  # 表单  # 清空  # 差异化 


相关文章: 怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  寿县云建站:智能SEO优化与多行业模板快速上线指南  制作销售网站教学视频,销售网站有哪些?  网站制作公司排行榜,抖音怎样做个人官方网站  C++如何使用std::optional?(处理可选值)  如何打造高效商业网站?建站目的决定转化率  江苏网站制作公司有哪些,江苏书法考级官方网站?  大型企业网站制作流程,做网站需要注册公司吗?  上海网站制作开发公司,上海买房比较好的网站有哪些?  如何获取开源自助建站系统免费下载链接?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  定制建站策划方案_专业建站与网站建设方案一站式指南  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何通过山东自助建站平台快速注册域名?  如何在橙子建站中快速调整背景颜色?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  表情包在线制作网站免费,表情包怎么弄?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  建站之星后台密码遗忘或太弱?如何重置与强化?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  c# 在高并发场景下,委托和接口调用的性能对比  如何制作一个表白网站视频,关于勇敢表白的小标题?  兔展官网 在线制作,怎样制作微信请帖?  怀化网站制作公司,怀化新生儿上户网上办理流程?  建站之星微信建站一键生成小程序+多端营销系统  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何在Windows 2008云服务器安全搭建网站?  如何在阿里云购买域名并搭建网站?  盘锦网站制作公司,盘锦大洼有多少5G网站?  广州美橙建站如何快速搭建多端合一网站?  html制作网站的步骤有哪些,iapp如何添加网页?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何在腾讯云免费申请建站?  青岛网站建设如何选择本地服务器?  建站之星代理平台如何选择最佳方案?  招贴海报怎么做,什么是海报招贴?  建站DNS解析失败?如何正确配置域名服务器?  建站之星如何防范黑客攻击与数据泄露?  建站主机CVM配置优化、SEO策略与性能提升指南  中山网站推广排名,中山信息港登录入口?  如何在IIS管理器中快速创建并配置网站?  孙琪峥织梦建站教程如何优化数据库安全?  贸易公司网站制作流程,出口贸易网站设计怎么做?  代刷网站制作软件,别人代刷火车票靠谱吗?  建站10G流量真的够用吗?如何应对访问高峰?  建站之家VIP精选网站模板与SEO优化教程整合指南  C#如何序列化对象为XML XmlSerializer用法  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何选择PHP开源工具快速搭建网站? 

您的项目需求

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