观察者模式通过接口和组合在Go中实现对象间一对多依赖,当主体状态变化时自动通知所有观察者。示例中EventManager管理Observer列表,支持注册、注销与通知,EmailService和LogService作为具体观察者接收消息。主函数模拟用户登录触发通知,输出显示注册的观察者收到事件,注销后不再接收。使用互斥锁可保证并发安全,建议异步处理通知以避免阻塞,适用于解耦事件发布与处理逻辑。
观察者模式是一种行为设计模式,适用于对象之间存在一对多依赖关系的场景,当一个对象状态改变时,所有依赖它的对象都会自动收到通知。在 Go 语言中,虽然没有类和继承的概念,但通过接口和组合机制可以非常简洁地实现观察者模式。
核心是定义两个角色:主题(被观察者)和观察者。主题维护一组观察者,并提供注册、注销和通知的方法;观察者实现接收通知的接口。
示例代码:
type Observer interface {
Update(message string)
}
type Subject interface {
Register(observer Observer)
Unregister(observer Observer)
Notify(message string)
}
这里定义了 Observer 接口,包含一个 Update 方法用于接收更新消息;Subject 接口则提供了注册、注销和广播通知的能力。
以一个简单的事件通知系统为例,比如用户登录后需要通知日志服务、邮件服务等模块。
type EventManager struct {
observers
[]Observer
}
func (em *EventManager) Register(observer Observer) {
em.observers = append(em.observers, observer)
}
func (em *EventManager) Unregister(observer Observer) {
for i, obs := range em.observers {
if obs == observer {
em.observers = append(em.observers[:i], em.observers[i+1:]...)
break
}
}
}
func (em *EventManager) Notify(message string) {
for _, observer := range em.observers {
observer.Update(message)
}
}
// 具体观察者
type EmailService struct{}
func (e *EmailService) Update(message string) {
fmt.Println("EmailService received:", message)
}
type LogService struct{}
func (l *LogService) Update(message string) {
fmt.Println("LogService logged:", message)
}
上面实现了 EventManager 作为具体主题,管理多个观察者。两个具体观察者 EmailService 和 LogService 在收到通知时执行各自逻辑。
模拟用户登录后触发事件,通知所有监听该事件的服务。
func main() {
eventManager := &EventManager{}
emailSvc := &EmailService{}
logSvc := &LogService{}
// 注册观察者
eventManager.Register(emailSvc)
eventManager.Register(logSvc)
// 模拟用户登录
eventManager.Notify("User logged in")
// 取消某个观察者
eventManager.Unregister(emailSvc)
// 再次通知,此时只有日志服务会收到
eventManager.Notify("User updated profile")
}
输出结果:
EmailService received: User logged in可以看到,在注销邮箱服务后,它不再接收到后续的通知。
基本上就这些。Go 的接口和结构体组合让观察者模式实现变得轻量且灵活,适合用于解耦事件发布与处理逻辑,提升系统的可维护性和扩展性。
# go
# golang
# app
# ai
# 邮箱
# 结构体
# 循环
# 继承
# 接口
# 并发
# 对象
# 事件
# 异步
# 用户登录
# 适用于
# 是一种
# 互斥
# 多个
# 可以看到
# 为例
# 它不
# 或未
# 再接
相关文章:
如何快速完成中国万网建站详细流程?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
上海网站制作开发公司,上海买房比较好的网站有哪些?
建站之星后台密码遗忘或太弱?如何重置与强化?
无锡营销型网站制作公司,无锡网选车牌流程?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
如何通过PHP快速构建高效问答网站功能?
网站设计制作企业有哪些,抖音官网主页怎么设置?
c++怎么用jemalloc c++替换默认内存分配器【性能】
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何快速搭建虚拟主机网站?新手必看指南
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何破解联通资金短缺导致的基站建设难题?
股票网站制作软件,网上股票怎么开户?
如何实现建站之星域名转发设置?
教程网站设计制作软件,怎么创建自己的一个网站?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何快速辨别茅台真假?关键步骤解析
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
威客平台建站流程解析:高效搭建教程与设计优化方案
已有域名能否直接搭建网站?
名字制作网站免费,所有小说网站的名字?
建站之星如何通过成品分离优化网站效率?
Swift中switch语句区间和元组模式匹配
网站制作知乎推荐,想做自己的网站用什么工具比较好?
制作网页的网站有哪些,电脑上怎么做网页?
网站按钮制作软件,如何实现网页中按钮的自动点击?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何在IIS中新建站点并配置端口与物理路径?
如何使用Golang table-driven基准测试_多组数据测量函数效率
Java解压缩zip - 解压缩多个文件或文件夹实例
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何配置支付宝与微信支付功能?
如何续费美橙建站之星域名及服务?
建站之星2.7模板:企业网站建设与h5定制设计专题
公司网站制作需要多少钱,找人做公司网站需要多少钱?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
C#如何序列化对象为XML XmlSerializer用法
html制作网站的步骤有哪些,iapp如何添加网页?
宿州网站制作公司兴策,安徽省低保查询网站?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
七夕网站制作视频,七夕大促活动怎么报名?
建站主机与服务器功能差异如何区分?
如何通过云梦建站系统实现SEO快速优化?
如何在服务器上配置二级域名建站?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
*请认真填写需求信息,我们会在24小时内与您取得联系。