中介者模式通过封装对象间交互来降低耦合,适用于Go语言中需解耦通信的场景。1. 定义Mediator和Colleague接口,实现Send和Receive方法。2. ChatRoom作为中介者维护用户列表并转发消息。3. User通过中介发送消息,不直接引用其他用户。4. 示例中Alice发消息经ChatRoom转给Bob,体现集中控制通信。该模式提升可维护性,适合复杂交互系统,但简单场景应避免过度设计。Go的接口与组合机制使其实现简洁自然。

在Go语言中实现中介者(Mediator)模式,核心是解耦多个对象之间的直接交互,转而通过一个“中介者”来协调通信。这种方式特别适用于多个组件需要频繁通信但又不希望彼此强依赖的场景,比如聊天室、GUI事件系统或微服务协调器。
什么是中介者模式
中介者模式定义了一个中介对象来封装一系列对象之间的交互,使对象之间不需要显式地相互引用,从而降低耦合度,并且可以独立地改变它们之间的交互逻辑。
在Go中,由于没有继承机制,我们更多依赖接口和组合来实现这种行为模式。
使用接口定义中介者与同事角色
先定义两个关键部分:中介者接口和同事(Colleague)接口。每个同事对象持有中介者的引用,通过它发送和接收消息。
立即学习“go语言免费学习笔记(深入)”;
type Mediator interface {Send(message string, sender Colleague)
}
type Colleague interface {
Receive(message string)
}
每一个具体同事结构体实现 Receive 方法,同时包含一个指向中介者的指针,用于发送消息。
实现一个聊天室示例
假设我们要构建一个简单的多人聊天室,用户之间不直接通信,而是通过聊天室中转。
type ChatRoom struct {users map[string]Colleague
}
func (c *ChatRoom) Register(user Colleague) {
if c.users == nil {
c.users = make(map[string]Colleague)
}
c.users[fmt.Sprintf("%p", user)] = user
}
func (c *ChatRoom) Send(message string, sender Colleague) {
for _, user := range c.users {
if user != sender {
user.Receive(message)
}
}
}
接下来定义用户结构体:
type User struct {name string
mediator Mediator
}
func NewUser(name string, med Mediator) *User {
return &User{name: name, mediator: med}
}
func (u *User) Send(msg string) {
u.mediator.Send(fmt.Sprintf("[%s]: %s", u.name, msg), u)
}
func (u *User) Receive(msg string) {
fmt.Printf("%s 收到消息: %s\n", u.name, msg)
}
使用方式如下:
room := &ChatRoom{}alice := NewUser("Alice", room)
bob := NewUser("Bob", room)
room.Register(alice)
room.Register(bob)
alice.Send("Hello, Bob!")
输出结果为:
Bob 收到消息: [Alice]: Hello, Bob!
优势与适用场景
中介者模式在Go项目中的价值体现在:
- 减少结构体之间的直接依赖,提升可维护性
- 集中控制交互逻辑,便于调试和扩展
- 适合用在状态管理复杂、通信路径多的系统中,如游戏服务器、事件总线、配置同步等
注意不要滥用。如果对象间交互简单,引入中介者反而增加复杂度。
基本上就这些。Go通过接口和组合能很自然地实现中介者模式,关键是设计好通信契约,保持职责清晰。










