观察者模式通过Subject和Observer接口实现事件驱动,Go中可用接口与切片维护订阅关系,配合sync.RWMutex保证并发安全,示例中EventBus注册、注销并通知观察者,Logger与Notifier响应事件,主函数演示注册、触发与移除流程。

在Go语言中,观察者模式常用于实现事件处理系统,让多个对象(观察者)监听某个主体(被观察者)的状态变化或事件发生。这种模式在解耦事件发布者和订阅者方面非常有效,适合构建灵活的事件驱动程序。
定义事件主体和观察者接口
观察者模式的核心是被观察者维护一个观察者列表,并在状态变化时通知它们。先定义两个基本接口:
– Subject(被观察者):管理观察者并负责通知。
– Observer(观察者):定义接收通知的方法。
示例代码:
type Event stringtype Observer interface {OnEvent(event Event)}
type Subject interface {Register(obs Observer)Unregister(obs Observer)Notify(event Event)}
实现具体的被观察者
创建一个结构体来实现 Subject 接口。它使用切片保存观察者列表,注意并发安全时可使用 sync.RWMutex。
立即学习“go语言免费学习笔记(深入)”;
type EventBus struct { observers []Observer mu sync.RWMutex}func (bus *EventBus) Register(obs Observer) {bus.mu.Lock()defer bus.mu.Unlock()bus.observers = append(bus.observers, obs)}
func (bus *EventBus) Unregister(obs Observer) {bus.mu.Lock()defer bus.mu.Unlock()for i, o := range bus.observers {if o == obs {bus.observers = append(bus.observers[:i], bus.observers[i+1:]...)break}}}
func (bus *EventBus) Notify(event Event) {bus.mu.RLock()defer bus.mu.RUnlock()for _, obs := range bus.observers {obs.OnEvent(event)}}
编写具体的观察者
每个观察者实现 OnEvent 方法,定义自己对事件的响应逻辑。
type Logger struct{}func (l *Logger) OnEvent(event Event) {log.Printf("日志记录: %s", event)}
type Notifier struct{}
func (n *Notifier) OnEvent(event Event) {fmt.Printf("发送通知: %sn", event)}
使用示例
将观察者注册到事件总线,触发事件后自动广播给所有订阅者。
func main() { bus := &EventBus{} logger := &Logger{} notifier := &Notifier{}bus.Register(logger)bus.Register(notifier)bus.Notify("user.login") // 两个观察者都会收到通知bus.Unregister(notifier)bus.Notify("system.shutdown") // 只有 logger 收到
}
基本上就这些。通过接口和组合,Go能简洁地实现观察者模式。如果项目更复杂,可扩展支持事件类型过滤、异步通知或基于 channel 的轻量机制。关键是保持订阅与通知逻辑清晰,避免内存泄漏(及时注销观察者)。
以上就是Golang如何使用观察者模式处理事件的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1415994.html
微信扫一扫
支付宝扫一扫