新闻中心
Golang如何应用观察者模式_Golang 观察者模式使用实践
观察者模式通过接口和组合在Go中实现对象间一对多依赖,当主体状态变化时自动通知所有观察者。示例中EventManager管理Observer列表,支持注册、注销与通知,EmailService和LogService作为具体观察者接收消息。主函数模拟用户登录触发通知,输出显示注册的观察者收到事件,注销后不再接收。使用互斥锁可保证并发安全,建议异步处理通知以避免阻塞,适用于解耦事件发布与处理逻辑。

观察者模式是一种行为设计模式,适用于对象之间存在一对多依赖关系的场景,当一个对象状态改变时,所有依赖它的对象都会自动收到通知。在 Go 语言中,虽然没有类和继承的概念,但通过接口和组合机制可以非常简洁地实现观察者模式。
定义主题(Subject)和观察者(Observer)接口
核心是定义两个角色:主题(被观察者)和观察者。主题维护一组观察者,并提供注册、注销和通知的方法;观察者实现接收通知的接口。
示例代码:
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 在收到通知时执行各自逻辑。
Motiff妙多
Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
使用场景示例:用户登录事件通知
模拟用户登录后触发事件,通知所有监听该事件的服务。
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 inLogService logged: User logged in
LogService logged: User updated profile
可以看到,在注销邮箱服务后,它不再接收到后续的通知。
优化建议与注意事项
- 使用互斥锁保护观察者列表,避免并发修改问题
- 可扩展为支持多种事件类型(如按事件名分类通知)
- 观察者更新尽量异步执行,防止阻塞其他通知
- 注意循环引用或未及时注销导致的内存泄漏
基本上就这些。Go 的接口和结构体组合让观察者模式实现变得轻量且灵活,适合用于解耦事件发布与处理逻辑,提升系统的可维护性和扩展性。
以上就是Golang如何应用观察者模式_Golang 观察者模式使用实践的详细内容,更多请关注其它相关文章!
# 可以看到
# 明威seo优化大师
# 杭州网站性能优化
# 饮料有什么网站推广方案
# seo的试用期工资
# 楼兰小说网站建设素材
# 网站的技术建设方案
# 常州短视频seo公司
# 山东省财政厅网站建设
# 亳州网站优化推广系统
# 上海紫昌网站建设
# 解决问题
# 正则表达式
# go
# 中文网
# 相关文章
# 多个
# 互斥
# 是一种
# 适用于
# 用户登录
# 邮箱
# ai
# app
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
qq游戏跨平台入口_qq游戏多设备同步登录
12306选座怎么选到商务座_12306商务座选择与配置说明
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
必由学官网首页入口 必由学教师网页版登录指南
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
火锅吃太多会怎样 火锅吃太多会上火吗
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
限制HTML日期输入框的日期选择范围
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
UC浏览器网页版登录入口官网 电脑版网址入口
多闪网页版在线观看免费入口_多闪官网访问入口
汽车之家官方网站官网入口_汽车之家网页版直接进入
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
狙击外星人小游戏开始_狙击外星人小游戏立即开始
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
poki网页游戏推荐_poki免费游戏平台入口
12306选座怎么选到临时改签座_12306改签选座策略与步骤
J*aScript中正确使用querySelectorAll与复杂CSS选择器
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
美团外卖商家服务中心入口 美团商家版官网入口
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
Lar*el递归关系中排除子孙节点的策略
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
J*aScript DOM操作:高效清空列表元素的策略与实践
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
千牛数据看板网页版_千牛数据看板网页版访问方法
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
微博网页版主页入口 微博官方网站免登录访问
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
精准捕获:如何在页面中监听除特定元素外的所有点击事件
Lar*el 8 多关键词数据库搜索优化实践
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
windows10怎么关闭系统提示音_windows10彻底静音设置方法
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
c++如何实现单例设计模式_c++线程安全的单例模式写法
使用Python高效删除Word宏并转换DOCM为DOCX格式
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能


2025-11-27
浏览次数:次
返回列表
有日志服务会收到
eventManager.Notify("User updated profile")
}