值得一看
广告
彩虹云商城
广告

热门广告位

如何在Golang中实现中介者模式解耦对象

中介者模式通过引入中间对象管理多个对象间的交互,降低耦合度。定义Mediator接口规范通信行为,如Send和Receive方法;具体中介者ChatRoom维护同事对象列表并转发消息,避免直接引用。同事对象User通过中介者发送和接收消息,实现解耦。使用时将用户注册到同一中介者,即可实现群聊等场景的消息广播。新增对象无需修改现有代码,扩展性强,适用于聊天室、GUI联动等复杂交互场景。

如何在golang中实现中介者模式解耦对象

在Golang中实现中介者模式,核心是通过一个中间对象来管理多个对象之间的交互,避免它们直接引用彼此,从而降低耦合度。这种模式特别适用于多个对象频繁通信的场景,比如聊天室、GUI组件联动或游戏中的角色协作系统。

定义中介者接口

中介者通常是一个接口,规定了对象如何通过它进行通信。这个接口可以包含注册、发送消息、通知等方法。

例如:

Mediator 接口定义对象间通信的规范:

<pre class="brush:php;toolbar:false;">type Mediator interface {
Send(message string, sender Colleague)
}
type Colleague interface {
Receive(message string)
}

实现具体中介者

具体中介者持有对各个协作对象(同事)的引用,并负责转发消息。这样,同事对象不再需要知道其他对象的存在。

立即学习“go语言免费学习笔记(深入)”;

百度文心百中

百度文心百中

百度大模型语义搜索体验中心

百度文心百中22

查看详情
百度文心百中

以聊天室为例:

<pre class="brush:php;toolbar:false;">type ChatRoom struct {
colleagues []Colleague
}
func (c *ChatRoom) Register(colleague Colleague) {
c.colleagues = append(c.colleagues, colleague)
}
func (c *ChatRoom) Send(message string, sender Colleague) {
for _, colleague := range c.colleagues {
// 不发给发送者自己
if colleague != sender {
colleague.Receive(message)
}
}
}

定义同事对象

每个同事对象都持有一个中介者的引用,通过它来发送和接收消息,而不是直接调用其他对象。

用户实现:

<pre class="brush:php;toolbar:false;">type User struct {
name     string
mediator Mediator
}
func NewUser(name string, mediator Mediator) *User {
return &User{name: name, mediator: mediator}
}
func (u *User) Send(message string) {
fmt.Printf("%s 发送消息: %s\n", u.name, message)
u.mediator.Send(message, u)
}
func (u *User) Receive(message string) {
fmt.Printf("%s 收到消息: %s\n", u.name, message)
}

使用示例

将所有用户注册到同一个中介者中,之后他们通过中介通信。

<pre class="brush:php;toolbar:false;">func main() {
chatRoom := &ChatRoom{}
alice := NewUser("Alice", chatRoom)
bob := NewUser("Bob", chatRoom)
charlie := NewUser("Charlie", chatRoom)
chatRoom.Register(alice)
chatRoom.Register(bob)
chatRoom.Register(charlie)
alice.Send("大家好!")
// 输出:
// Alice 发送消息: 大家好!
// Bob 收到消息: 大家好!
// Charlie 收到消息: 大家好!
}

通过这种方式,新增用户不需要修改现有代码,只要注册到中介者即可。对象之间完全解耦,维护和扩展更方便。

基本上就这些,结构清晰,职责分明,适合复杂交互场景。

相关标签:

go golang app ai 用户注册 golang 接口 对象

大家都在看:

Go语言go.net/html库:深入解析与提取html.Node的文本内容
Go语言结构体嵌入:为何它不是面向对象继承?
深入解析:mgo中Go结构体_id字段检索失败的常见原因与解决方案
Go语言闭包与命名返回值:机制解析与应用实践
Go语言中实现XML到JSON的通用转换:结构体作为参数的技巧
温馨提示: 本文最后更新于2025-10-23 22:28:15,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容