Go中实现中介者模式的核心是用中介者接口封装交互逻辑,同事对象仅依赖Mediator接口并注册其中,通过Notify通信,中介者管理同事集合并分发事件,同事间完全解耦。

在 Go 语言中实现中介者模式,核心是**用一个中介者对象封装多个对象之间的交互逻辑**,让原本相互引用、频繁通信的组件只与中介者耦合,从而降低整体依赖复杂度。Go 没有类继承和接口强制实现机制,但凭借结构体、接口和组合,能简洁、地道地表达这一模式。
定义清晰的中介者接口
先抽象出中介者行为,比如消息转发、状态协调等。接口应聚焦“协调职责”,不暴露具体实现细节:
示例:
type Mediator interface {
Notify(sender interface{}, event string, data interface{})
Register(colleague Colleague)
}
这样任何同事对象(Colleague)只需知道如何通知中介者,无需了解其他同事类型或调用方式。
立即学习“go语言免费学习笔记(深入)”;
让同事对象持有中介者引用(弱耦合)
每个同事结构体包含一个 Mediator 字段(通常为接口类型),初始化时注入,而非硬编码创建中介者实例:
- 避免在同事内部 new Mediator,否则又形成强依赖
- 推荐通过构造函数参数传入,便于测试替换模拟中介者
- 同事只调用
mediator.Notify()发起交互,不直接调用其他同事方法
中介者内部管理同事集合并分发逻辑
中介者实现类(如 ChatRoom 或 FlightControl)维护一组注册的同事,收到通知后按规则路由或处理:
- 可用
map[interface{}]*Colleague或更类型安全的map[string]Colleague管理注册项 - 事件分发逻辑写在
Notify方法内:比如 “userA 发送消息” → 查找 userB → 调用其Receive() - 关键点:中介者知道所有同事的接口,但同事彼此完全不知晓——这是解耦的本质
用接口隔离同事行为,避免类型泄露
定义 Colleague 接口统一交互契约,例如:
type Colleague interface {
SetMediator(m Mediator)
Send(event string, data interface{})
Receive(event string, data interface{})
}
具体同事(如 User、Printer、Sensor)只实现该接口。中介者通过此接口调用,不依赖具体结构体,进一步提升可替换性和测试性。










