观察者模式是“一对多”依赖关系,被观察者状态改变时自动通知所有观察者;Go通过接口、切片和函数类型简洁实现,需定义Observer接口和Subject结构体,支持并发安全注册与通知。
观察者模式本质是“一对多”的依赖关系:当一个对象(被观察者)状态改变,所有依赖它的对象(观察者)自动收到通知并响应。Golang 没有内置接口或语法糖支持,但靠接口、切片和函数类型就能简洁实现,无需第三方库。
先定义一个通用的 Observer 接口,让所有观察者都实现 Update(event interface{}) 方法:
// Observer 定义观察者行为
type Observer interface {
Update(event interface{})
}
这样设计灵活:事件可以是字符串、结构体、自定义事件类型,甚至 map[string]interface{},由业务决定。
被观察者需维护观察者列表,并提供注册、注销、通知能力。用结构体封装状态和行为:
// 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小时内与您取得联系。