全网整合营销服务商

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

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

如何使用Golang实现观察者模式与事件通知_动态响应对象状态变化

观察者模式是“一对多”依赖关系,被观察者状态改变时自动通知所有观察者;Go通过接口、切片和函数类型简洁实现,需定义Observer接口和Subject结构体,支持并发安全注册与通知。

观察者模式的核心思路

观察者模式本质是“一对多”的依赖关系:当一个对象(被观察者)状态改变,所有依赖它的对象(观察者)自动收到通知并响应。Golang 没有内置接口或语法糖支持,但靠接口、切片和函数类型就能简洁实现,无需第三方库。

定义统一的事件通知接口

先定义一个通用的 Observer 接口,让所有观察者都实现 Update(event interface{}) 方法:

  // Observer 定义观察者行为
  type Observer interface {
    Update(event interface{})
  }

这样设计灵活:事件可以是字符串、结构体、自定义事件类型,甚至 map[string]interface{},由业务决定。

构建可观察的对象(Subject)

被观察者需维护观察者列表,并提供注册、注销、通知能力。用结构体封装状态和行为:

  // Subject 管理观察者并触发通知
  type Subject struct {
    observers []Observer
    mu sync.RWMutex
  }
  
  func (s *Subject) Register(o Observer) {
    s.mu.Lock()
    s.observers = append(s.observers, o)
    s.mu.Unlock()
  }
  
  func (s *Subject) Notify(event interface{}) {
    s.mu.RLock()
    defer s.mu.RUnlock()
    for _, o := range s.observers {
      o.Update(event)
    }
  }

注意加锁保护并发安全——尤其在 Web 服务或定时任务中,多个 goroutine 可能同时注册或通知。

具体使用:状态变化触发事件

以用户登录状态为例,封装一个 UserSession 结构体嵌入 Subject,并在关键方法中调用 Notify

  type UserSession struct {
    *Subject
    ID string
    IsLoggedIn bool
  }
  
  func (u *UserSession) Login() {
    u.IsLoggedIn = true
    u.Notify(map[string]string{
      "event": "login",
      "user_id": u.ID,
    })
  }

再写两个观察者:日志记录器和在线统计器:

  type Logger struct{}
  func (l Logger) Update(e interface{}) {
    log.Printf("LOG: %+v", e)
  }
  
  type OnlineCounter struct{ count int }
  func (c *OnlineCounter) Update(e interface{}) {
    if ev, ok := e.(map[string]string); ok && ev["event"] == "login" {
      c.count++
      log.Printf("Online now: %d", c.count)
    }
  }

组合使用:

  sess := &UserSession{
    Subject: &Subject{},
    ID: "u123",
  }
  
  sess.Register(Logger{})
  counter := &OnlineCounter{}
  sess.Register(counter)
  
  sess.Login() // 触发两个观察者的 Update

这样就实现了松耦合的动态响应:新增观察者只需实现接口并注册,不修改原有逻辑。


# go  # golang  # app  # session  # String  # if  # count  # for  # 封装  # printf  # register  # 字符串  # 结构体  # bool  # int  # 接口  # Struct  # Interface  # Event  # 切片  # append  # map  # 并发  # 对象  # 事件  # 记录器  # 就能  # 多个  # 只需  # 并在  # 自定义  # 为例  # 第三方  # 用户登录  # 加锁 


相关文章: 如何自定义建站之星网站的导航菜单样式?  网站制作软件有哪些,制图软件有哪些?  如何高效完成自助建站业务培训?  北京企业网站设计制作公司,北京铁路集团官方网站?  建站之星下载版如何获取与安装?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  自助网站制作软件,个人如何自助建网站?  如何选择靠谱的建站公司加盟品牌?  教学网站制作软件,学习*后期制作的网站有哪些?  江苏网站制作公司有哪些,江苏书法考级官方网站?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  广德云建站网站建设方案与建站流程优化指南  如何通过多用户协作模板快速搭建高效企业网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何选择网络建站服务器?高效建站必看指南  如何快速生成凡客建站的专业级图册?  免费网站制作appp,免费制作app哪个平台好?  历史网站制作软件,华为如何找回被删除的网站?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  如何高效利用亚马逊云主机搭建企业网站?  七夕网站制作视频,七夕大促活动怎么报名?  香港网站服务器数量如何影响SEO优化效果?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  黑客如何通过漏洞一步步攻陷网站服务器?  简单实现Android文件上传  常州企业建站如何选择最佳模板?  常州企业网站制作公司,全国继续教育网怎么登录?  代购小票制作网站有哪些,购物小票的简要说明?  制作电商网页,电商供应链怎么做?  建站之星微信建站一键生成小程序+多端营销系统  5种Android数据存储方式汇总  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  红河网站制作公司,红河事业单位身份证如何上传?  怎么将XML数据可视化 D3.js加载XML  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何基于云服务器快速搭建个人网站?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  家庭服务器如何搭建个人网站?  在线教育网站制作平台,山西立德教育官网?  建站之星导航配置指南:自助建站与SEO优化全解析  如何在腾讯云服务器上快速搭建个人网站?  存储型VPS适合搭建中小型网站吗?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  深圳网站制作案例,网页的相关名词有哪些?  网站制作难吗安全吗,做一个网站需要多久时间?  在线制作视频网站免费,都有哪些好的动漫网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。