中介者模式通过引入ChatRoom集中管理用户通信,使用户间解耦。用户发送消息时由ChatRoom广播给其他用户,避免直接依赖。Go中通过Mediator接口和User结构体实现,每个用户持有中介者引用,发送消息调用SendMessage,接收消息由Receive处理。示例中Alice、Bob、Charlie通过ChatRoom通信,新增用户不影响现有逻辑。关键在于中介者应专注协调,避免职责过重,防止成为“上帝对象”,从而保持系统清晰可维护。

在Go语言中,中介者模式能有效解耦多个对象之间的直接通信,将交互逻辑集中到一个中介者中管理。当多个对象之间频繁交互,导致代码高度耦合时,使用中介者模式可以让系统更清晰、更易维护。
场景说明:聊天室中的用户通信
假设有多个用户(User)在一个聊天室中发送消息。如果每个用户都直接向其他用户发送消息,会导致对象之间强耦合。通过引入中介者(ChatRoom),所有通信都通过它转发,实现解耦。
定义中介者接口和具体实现
中介者定义统一接口,具体中介者实现消息的转发逻辑。
type Mediator interface { SendMessage(message string, sender User)}
具体中介者 ChatRoom 维护用户列表,并在收到消息时广播给其他用户(不包括发送者)。
立即学习“go语言免费学习笔记(深入)”;
type ChatRoom struct { users []User}func (c *ChatRoom) AddUser(user User) { c.users = append(c.users, user)}func (c *ChatRoom) SendMessage(message string, sender User) { for _, user := range c.users { if user != sender { user.Receive(message) } }}
定义用户对象
用户持有对中介者的引用,发送消息时调用中介者的 SendMessage 方法,接收消息则由中介者触发。
type User struct { name string chatRoom *ChatRoom}func NewUser(name string, room *ChatRoom) User { return User{name: name, chatRoom: room}}func (u User) Send(message string) { u.chatRoom.SendMessage(message, u)}func (u User) Receive(message string) { fmt.Printf(“[%s] 收到消息: %sn”, u.name, message)}
使用示例
创建聊天室,添加用户,用户之间通过中介者通信,彼此无需知道对方存在。
func main() { chatRoom := &ChatRoom{} alice := NewUser(“Alice”, chatRoom) bob := NewUser(“Bob”, chatRoom) charlie := NewUser(“Charlie”, chatRoom) chatRoom.AddUser(alice) chatRoom.AddUser(bob) chatRoom.AddUser(charlie) alice.Send(“大家好,我是Alice!”) bob.Send(“Hi,我是Bob。”)}
输出:
[Bob] 收到消息: 大家好,我是Alice!
[Charlie] 收到消息: 大家好,我是Alice!
[Alice] 收到消息: Hi,我是Bob。
[Charlie] 收到消息: Hi,我是Bob。
每个用户只与中介者交互,新增用户或修改通信逻辑时,不影响现有用户代码。基本上就这些,不复杂但容易忽略的是,中介者要避免变成“上帝对象”,职责应聚焦在协调通信上。
以上就是Golang中介者模式解耦对象通信实例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1405492.html
微信扫一扫
支付宝扫一扫