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

在 Go 语言中,观察者模式(Observer Pattern)是一种常用的设计模式,用于实现对象间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知。这种模式非常适合事件驱动系统、消息广播、状态同步等场景。
我们先定义两个核心部分:观察者接口和被观察者(主题)结构体。
观察者接口 需要有一个接收通知的方法。被观察者维护一个观察者列表,并提供注册、注销和通知的方法。package main
import "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观察者模式事件通知示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号