新闻中心

如何用Golang实现观察者模式_Golang 观察者模式实践与示例

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

如何用golang实现观察者模式_golang 观察者模式实践与示例

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在 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自动换行显示 

搜索