新闻中心
如何用Golang实现观察者模式_Golang 观察者模式实践与示例
观察者模式通过接口和组合在Go中实现一对多依赖,当主题状态改变时通知所有观察者。示例中WeatherStation作为主题维护观察者列表并推送温度变化,PhoneDisplay和WebDisplay作为观察者接收更新,支持动态注册与移除,符合开闭原则,适用于事件驱动系统,并可扩展并发安全机制。

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在 Golang 中,虽然没有类和继承的概念,但通过接口和组合可以非常简洁地实现观察者模式。
观察者模式的核心组成
观察者模式通常包
含两个主要角色:
- Subject(主题):维护观察者列表,提供注册、注销和通知观察者的接口。
- Observer(观察者):定义接收通知的方法,具体逻辑由实现者决定。
在 Go 中,我们使用接口来抽象这些行为,使代码更灵活、可扩展。
基本实现示例
下面是一个简单的天气数据监控系统示例,展示如何用 Go 实现观察者模式。
type Observer interface { Update(temperature float64) } type Subject interface { RegisterObserver(o Observer) RemoveObserver(o Observer) NotifyObservers() }定义一个具体的主题结构体,比如天气站:
type WeatherStation struct { observers []Observer temperature float64 } func (w *WeatherStation) SetTemperature(temp float64) { w.temperature = temp w.NotifyObservers() } func (w *WeatherStation) RegisterObserver(o Observer) { w.observers = append(w.observers, o) } func (w *WeatherStation) RemoveObserver(o Observer) { for i, observer := range w.observers { if observer == o { w.observers = append(w.observers[:i], w.observers[i+1:]...) break } } } func (w *WeatherStation) NotifyObservers() { for _, observer := range w.observers { observer.Update(w.temperature) } }再定义几个观察者,例如手机显示器和网页显示器:
小云雀
剪映出品的AI视频和图片创作助手
1949
查看详情
type PhoneDisplay struct{}
func (p *PhoneDisplay) Update(temperature float64) {
fmt.Printf("手机显示温度变化: %.2f°C\n", temperature)
}
type WebDisplay struct{}
func (w *WebDisplay) Update(temperature float64) {
fmt.Printf("网页显示温度更新: %.2f°C\n", temperature)
}
使用方式如下:
func main() { station := &WeatherStation{} phone := &PhoneDisplay{} web := &WebDisplay{} station.RegisterObserver(phone) station.RegisterObserver(web) station.SetTemperature(25.5) // 两者都会收到通知 station.RemoveObserver(phone) station.SetTemperature(30.0) // 只有网页显示会收到 }优点与适用场景
这种实现方式解耦了主题和观察者,新增观察者无需修改主题代码,符合开闭原则。
- 适用于事件驱动系统,如 UI 更新、消息广播、日志监听等。
- 可以轻松扩展,比如加入异步通知机制或过滤条件。
如果需要支持并发安全,可以在 Subject 中加入互斥锁保护观察者列表的读写操作。
小结
Go 的接口和匿名组合让观察者模式实现变得直观且轻量。通过定义清晰的交互契约,可以构建出灵活、可维护的通知系统。基本上就这些,不复杂但容易忽略细节。
以上就是如何用Golang实现观察者模式_Golang 观察者模式实践与示例的详细内容,更多请关注其它相关文章!
# 中文网
# 做网站推广直播赚钱吗
# 微店营销方案和推广
# 日剧网站建设银行
# 电扇品牌营销推广方案ppt
# 汕头软文推广营销
# seo怎么来挣钱
# SEO牛皮人员
# 网站建设运营面试经验
# 无锡seo推广引流方案
# 网站建设用什么框架
# 解决问题
# 正则表达式
# go
# 相关文章
# 是一种
# 开闭
# 几个
# 是一个
# 适用于
# 如何用
# ai
# 显示器
# app
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Go语言中的*string:深入理解字符串指针
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
汽水音乐在线解析 汽水音乐在线解析入口
免费抖音短视频入口_抖音网页版短视频免费通道
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
J*aScript map 迭代中检测空数组元素的有效方法
在WordPress中通过REST API获取BasicAuth保护的远程文章
2026春节假期时间安排 2026春节假日查询
C++如何解决segmentation fault_C++段错误调试与原因分析
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
Win11怎么关闭快速启动_Win11彻底关机设置教程
《噬血代码2》新预告片发布 展示游戏剧情
J*aScript Promise链中如何正确终止后续.then执行并处理错误
创客贴用户入口官网登录 创客贴网页版电脑版系统
Python异步编程实践:使用Binance API构建实时交易数据流
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
c++ 命名空间怎么用 c++ namespace使用指南
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
抓大鹅无需下载版 抓大鹅秒玩版入口
解决Bootstrap卡片顶部边距导致背景图下移的问题
漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口
抖音网页版怎么|直播|_抖音网页版开播操作指南
J*aScript异步迭代器_j*ascript异步遍历
Typer应用中动态命令行参数的解析与处理
vivo云服务网页版登录 怎么登录vivo云服务网页版
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
精准捕获:如何在页面中监听除特定元素外的所有点击事件
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
163邮箱注册官网 免费申请163个人邮箱
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
CSS图片焦点样式实现教程:理解与应用tabindex属性
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
Django表单提交验证失败后保持字段值不刷新
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
AngularJS $http POST请求数据传递与Go后端接收实践
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
新三国志曹操传110级星符试炼夏侯渊极难攻略
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示


2025-11-19
浏览次数:次
返回列表