新闻中心

Golang如何应用观察者模式_Golang 观察者模式使用实践

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

golang如何应用观察者模式_golang 观察者模式使用实践

观察者模式是一种行为设计模式,适用于对象之间存在一对多依赖关系的场景,当一个对象状态改变时,所有依赖它的对象都会自动收到通知。在 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 作为具体主题,管理多个观察者。两个具体观察者 EmailServiceLogService 在收到通知时执行各自逻辑。

Motiff妙多 Motiff妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多

使用场景示例:用户登录事件通知

模拟用户登录后触发事件,通知所有监听该事件的服务。

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
LogService 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的引用计数功能 

搜索