首页 > 后端开发 > Golang > 正文

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

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

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

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在 Golang 中,虽然没有类和继承的概念,但通过接口和组合可以非常简洁地实现观察者模式。

观察者模式的核心组成

观察者模式通常包含两个主要角色:

  • Subject(主题):维护观察者列表,提供注册、注销和通知观察者的接口。
  • Observer(观察者):定义接收通知的方法,具体逻辑由实现者决定。

在 Go 中,我们使用接口来抽象这些行为,使代码更灵活、可扩展。

基本实现示例

下面是一个简单的天气数据监控系统示例,展示如何用 Go 实现观察者模式。

立即学习go语言免费学习笔记(深入)”;

type Observer interface { Update(temperature float64) } type Subject interface { RegisterObserver(o Observer) RemoveObserver(o Observer) NotifyObservers() }

定义一个具体的主题结构体,比如天气站:

码哩写作
码哩写作

最懂作者的AI辅助创作工具

码哩写作 91
查看详情 码哩写作
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) } }

再定义几个观察者,例如手机显示器和网页显示器:

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 观察者模式实践与示例的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号