中介者模式通过引入中介者对象集中管理多个对象间的交互,降低耦合度。在Go中,利用接口和组合实现该模式,如聊天室系统中用户通过中介者发送消息,无需直接引用彼此,提升可维护性和扩展性。

在Go语言开发中,当多个对象之间频繁交互时,直接引用会导致系统高度耦合,难以维护。中介者模式(Mediator Pattern)通过引入一个中介者对象来封装一系列对象之间的交互,使对象之间不必相互引用,从而降低耦合度。
什么是中介者模式
中介者模式的核心思想是:将原本多个对象之间的复杂通信关系集中到一个中介者对象中进行管理。对象不再直接与其他对象通信,而是通过中介者转发消息。这样每个对象只需了解中介者,而不必知道其他协作对象的细节。
该模式适用于多个对象之间存在复杂交互逻辑的场景,比如聊天室系统、GUI组件联动、游戏中的角色与系统交互等。
Go中实现中介者模式的关键结构
在Go语言中,由于没有类继承机制,我们通常通过接口和组合来实现设计模式。中介者模式的基本组成包括:
立即学习“go语言免费学习笔记(深入)”;
- Mediator 接口:定义同事对象发送消息的统一方法。
- ConcreteMediator 结构体:实现 Mediator 接口,维护所有同事对象的引用,并协调它们之间的交互。
- Colleague 接口或结构体:表示参与交互的对象,持有对中介者的引用,通过中介者通信。
代码示例:聊天室中的中介者模式
下面是一个基于中介者模式的简单聊天室实现:
package main
import "fmt"
// 用户接口
type User interface {
GetName() string
Receive(message, from string)
Send(to string, message string)
}
// 聊天室作为中介者
type ChatRoom struct {
users map[string]User
}
func NewChatRoom() *ChatRoom {
return &ChatRoom{
users: make(map[string]User),
}
}
func (c *ChatRoom) Register(user User) {
c.users[user.GetName()] = user
}
func (c *ChatRoom) SendMessage(from, to, msg string) {
sender, exists := c.users[from]
if !exists {
fmt.Printf("用户 %s 不在聊天室中\n", from)
return
}
if to == "" {
// 群发
for name, user := range c.users {
if name != from {
user.Receive(msg, from)
}
}
return
}
// 发送给指定用户
receiver, exists := c.users[to]
if !exists {
sender.Receive(fmt.Sprintf("用户 %s 不存在", to), "系统")
return
}
receiver.Receive(msg, from)
}
// 具体用户实现
type ChatUser struct {
name string
mediator *ChatRoom
}
func NewChatUser(name string, room *ChatRoom) *ChatUser {
user := &ChatUser{
name: name,
mediator: room,
}
room.Register(user)
return user
}
func (u *ChatUser) GetName() string {
return u.name
}
func (u *ChatUser) Send(to, message string) {
u.mediator.SendMessage(u.name, to, message)
}
func (u *ChatUser) Receive(message, from string) {
fmt.Printf("[%s] 收到来自 %s 的消息: %s\n", u.name, from, message)
}
func main() {
room := NewChatRoom()
alice := NewChatUser("Alice", room)
bob := NewChatUser("Bob", room)
charlie := NewChatUser("Charlie", room)
alice.Send("", "大家好!") // 群发
bob.Send("Charlie", "你好,Charlie!") // 私聊
}
运行结果:
[Bob] 收到来自 Alice 的消息: 大家好! [Charlie] 收到来自 Alice 的消息: 大家好! [Charlie] 收到来自 Bob 的消息: 你好,Charlie!
中介者模式的优势与适用场景
使用中介者模式后,用户之间无需知道彼此的存在,所有通信都通过ChatRoom完成。这带来了以下好处:
- 降低对象间的耦合度,新增用户不影响现有逻辑。
- 集中控制交互流程,便于扩展消息记录、权限校验等功能。
- 提升可测试性,可以单独测试中介者逻辑。
适合使用中介者模式的场景包括:
- 多个对象需要协调行为但又不能强依赖。
- 交互逻辑复杂,分散在各个对象中难以维护。
- 希望动态控制对象之间的通信方式。
基本上就这些。Go语言虽无传统面向对象语法,但通过接口与组合能优雅实现中介者模式,有效解耦系统模块。关键在于明确职责分离:对象专注自身行为,中介者负责协调。这种结构让代码更清晰、更易扩展。










