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

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在 Golang 中,虽然没有类和继承的概念,但通过接口和组合可以非常简洁地实现观察者模式。
观察者模式的核心组成
观察者模式通常包含两个主要角色:
- Subject(主题):维护观察者列表,提供注册、注销和通知观察者的接口。
- Observer(观察者):定义接收通知的方法,具体逻辑由实现者决定。
在 Go 中,我们使用接口来抽象这些行为,使代码更灵活、可扩展。
基本实现示例
下面是一个简单的天气数据监控系统示例,展示如何用 Go 实现观察者模式。
立即学习“go语言免费学习笔记(深入)”;
type Observer interface { Update(temperature float64) } type Subject interface { RegisterObserver(o Observer) RemoveObserver(o Observer) NotifyObservers() }定义一个具体的主题结构体,比如天气站:
再定义几个观察者,例如手机显示器和网页显示器:
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 的接口和匿名组合让观察者模式实现变得直观且轻量。通过定义清晰的交互契约,可以构建出灵活、可维护的通知系统。基本上就这些,不复杂但容易忽略细节。










