中介者模式通过引入中介者对象集中管理组件交互,实现解耦。在Golang聊天室示例中,用户通过ChatServer发送消息,避免直接引用其他用户,降低耦合,提升可维护性。1. 中介者(ChatMediator)定义通信接口;2. 具体中介者(ChatServer)管理用户并转发消息;3. 同事类(User)通过中介者收发消息,不直接通信。该模式适用于聊天系统、UI联动等场景,但需防中介者过度膨胀。
在复杂系统中,多个对象之间直接通信会导致高度耦合,难以维护和扩展。Golang 中通过中介者模式(Mediator Pattern)可以有效解耦对象间的交互逻辑。该模式的核心思想是引入一个“中介者”对象,集中处理对象之间的通信,让各个组件不再相互引用,而是通过中介者进行消息传递。
中介者模式包含以下几个关键角色:
这种结构特别适用于如聊天室、UI组件联动、游戏对象交互等场景。
假设我们正在构建一个简单的多人聊天室,用户(User)不能直接向其他用户发送消息,必须通过聊天服务器(ChatServer)中转。这就是典型的中介者应用场景。
package main // Mediator interface type ChatMediator interface { SendMessage(message string, user User) } // ConcreteMediator type ChatServer struct { users []User } func (c *ChatServer) AddUser(user User) { c.users = append(c.users, user) } func (c *ChatServer) SendMessage(message string, sender User) { for _, user := range c.users { // 不向发送者自己转发消息 if user.GetName() != sender.GetName() { user.Receive(message) } } } // Colleague interface type User interface { GetName() string Send(message string) Receive(message string) } // Concrete colleague type ChatUser struct { name string mediator ChatMediator } func NewChatUser(name string, mediator ChatMediator) *ChatUser { return &ChatUser{ name: name, mediator: mediator, } } func (u *ChatUser) GetName() string { return u.name } func (u *ChatUser) Send(message string) { println(u.name + " 发送消息: " + message) u.mediator.SendMessage(message, u) } func (u *ChatUser) Receive(message string) { println(u.name + " 收到消息: " + message) } // 示例使用 func main() { server := &ChatServer{} alice := NewChatUser("Alice", server) bob := NewChatUser("Bob", server) charlie := NewChatUser("Charlie", server) server.AddUser(alice) server.AddUser(bob) server.AddUser(charlie) alice.Send("大家好,我是 Alice!") bob.Send("Hi,我是 Bob。") }
运行结果会显示每个用户发送的消息被其他用户接收,但用户之间没有直接依赖。所有通信都由 ChatServer 统一调度。
使用中介者模式后,系统具备更高的灵活性和可维护性:
常见适用场景包括:
虽然中介者模式能解耦,但也可能带来新的问题:
在 Golang 中,可以通过 goroutine + channel 进一步增强中介者的并发处理能力。例如,将消息投递放入 goroutine 异步执行,避免阻塞发送方。
基本上就这些。中介者模式不是万能钥匙,但在需要集中控制交互逻辑的场景下,它能让代码更清晰、更易扩展。Golang 的简洁语法和接口设计让这种模式实现起来非常自然。