观察者模式在Go中通过定义Observer接口和Subject结构体实现,支持事件驱动场景;具体观察者如EmailService和LogService接收通知,Subject维护观察者列表并提供注册、注销与广播方法;示例展示用户登录和订单创建时的消息推送,移除LogService后仅EmailService收到后续通知;可扩展用于配置更新或消息总线,结合Goroutine异步通知提升性能,需用sync.Mutex保证并发安全;该模式有效解耦组件通信。

在 Go 语言中,观察者模式(Observer Pattern)是一种常用的设计模式,用于实现对象间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知。这种模式非常适合事件驱动系统、消息广播、状态同步等场景。
定义观察者接口和被观察者结构
我们先定义两个核心部分:观察者接口和被观察者(主题)结构体。
观察者接口 需要有一个接收通知的方法。被观察者维护一个观察者列表,并提供注册、注销和通知的方法。
package mainimport "fmt"// Observer 观察者接口type Observer interface { Update(message string)}// Subject 被观察者(主题)type Subject struct { observers []Observer}// Attach 添加观察者func (s *Subject) Attach(o Observer) { s.observers = append(s.observers, o)}// Detach 移除观察者func (s *Subject) Detach(o Observer) { for i, observer := range s.observers { if observer == o { s.observers = append(s.observers[:i], s.observers[i+1:]...) break } }}// Notify 通知所有观察者func (s *Subject) Notify(message string) { for _, observer := range s.observers { observer.Update(message) }}
实现具体的观察者
接下来我们定义几个具体的观察者,比如 EmailService 和 LogService,它们会在收到通知时执行各自逻辑。
// EmailService 具体观察者:发送邮件type EmailService struct{}func (e *EmailService) Update(message string) { fmt.Println("EmailService 收到通知:", message)}// LogService 具体观察者:记录日志type LogService struct{}func (l *LogService) Update(message string) { fmt.Println("LogService 记录日志:", message)}
使用示例:事件通知
现在我们可以创建一个被观察者实例,注册多个观察者,并触发事件通知。
立即学习“go语言免费学习笔记(深入)”;
func main() { // 创建被观察者 subject := &Subject{} // 创建观察者 emailService := &EmailService{} logService := &LogService{} // 注册观察者 subject.Attach(emailService) subject.Attach(logService) // 发布事件 subject.Notify("用户已登录") // 可以动态移除某个观察者 subject.Detach(logService) fmt.Println("--- 移除 LogService 后 ---") subject.Notify("订单已创建")}
输出结果:
EmailService 收到通知: 用户已登录LogService 记录日志: 用户已登录--- 移除 LogService 后 ---EmailService 收到通知: 订单已创建
适用场景与扩展建议
这个模式可以轻松扩展用于配置变更通知、实时消息推送、事件总线等系统。如果需要更高的性能,可以结合 Goroutine 异步通知,避免阻塞主流程。
例如,将 Notify 方法改为并发执行:
func (s *Subject) Notify(message string) { for _, observer := range s.observers { go func(o Observer) { o.Update(message) }(observer) }}
注意此时需考虑并发安全,可引入 sync.Mutex 保护 observers 列表的读写。
基本上就这些。观察者模式在 Golang 中实现简洁清晰,适合解耦组件间的通信。
以上就是Golang Observer观察者模式事件通知示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1410162.html
微信扫一扫
支付宝扫一扫