全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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 作为具体主题,管理多个观察者。两个具体观察者 EmailServiceLogService 在收到通知时执行各自逻辑。

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

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

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 的接口和结构体组合让观察者模式实现变得轻量且灵活,适合用于解耦事件发布与处理逻辑,提升系统的可维护性和扩展性。


# 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小时内与您取得联系。