2023-08-27 20:23:37
在 Golang 中实现轻量级中介者模式时,sync.Map 可作为高效且并发安全的协调中心,通过存储组件引用并转发消息实现对象解耦。以下是具体实现方案及关键解析:

使用 sync.Map 存储组件引用,避免直接对象依赖:
type Mediator struct { components sync.Map // key: string, value: Component}2. 实现组件注册方法通过 Store 方法动态注册组件:
func (m *Mediator) Register(key string, comp Component) { m.components.Store(key, comp)}3. 实现消息转发方法通过 Load 查找接收方并调用其 Receive 方法:
func (m *Mediiator) Send(sender, receiver, msg string) { if val, ok := m.components.Load(receiver); ok { if comp, ok := val.(Component); ok { comp.Receive(sender, msg) } }}4. 定义组件接口所有组件需实现 Receive 方法以接收消息:
type Component interface { Receive(from, message string)}
并发安全存储
无需手动加锁,直接支持高并发读写。
适合读多写少的场景(如聊天室消息分发)。
动态注册与解耦
组件通过 key 注册,无需持有其他组件引用。
示例:聊天室中用户A发送消息给用户B,只需通过中介者转发。
类型安全转发
通过类型断言确保消息仅传递给实现 Component 接口的对象。
输出结果:
Bob收到来自Alice的消息: Hello, Bob!Alice收到来自Bob的消息: Hi, Alice!四、适用场景与注意事项适用场景类型断言安全
转发前需检查 val.(Component) 是否成功,否则会触发 panic。
内存泄漏风险
长期运行的系统中,需手动清理无效组件(如通过 Delete 方法):mediator.components.Delete("alice") // 用户Alice退出聊天室
批量操作限制
sync.Map 不支持直接遍历,如需批量操作可额外维护索引:type Mediator struct { components sync.Map keys []string // 辅助索引}

通过上述方法,可快速构建一个轻量级、高并发的中介者系统,适用于需要解耦复杂对象交互的场景。