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

2次阅读

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

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

用 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 中也可用闭包替代结构体中介者,适合轻量场景:

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

CodeGeeX

智谱AI发布的AI编程辅助工具插件,可以实现自动代码生成、代码翻译、自动编写注释以及智能问答等功能

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

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

立即学习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 的中介者模式不靠语法糖,而靠清晰的责任划分和显式的依赖注入——把“谁通知谁”变成“谁告诉中介者,中介者决定怎么转达”。写起来不复杂,但容易忽略边界控制,反而加重耦合。

text=ZqhQzanResources