如何用Golang实现观察者模式与事件通知_Golang 观察者模式事件实践

答案:通过接口和切片实现观察者模式,使用EventBus管理订阅与通知。定义Observer和Subject接口,用EventBus结构体实现注册、注销和通知功能,结合sync.RWMutex保证并发安全,创建具体观察者如Logger和Notifier处理事件,主函数中演示注册、通知与注销流程,实现解耦的事件系统。

如何用golang实现观察者模式与事件通知_golang 观察者模式事件实践

在 Golang 中实现观察者模式,核心是解耦事件发布者与订阅者之间的依赖。通过接口和切片管理订阅关系,可以轻松构建灵活的事件通知系统。下面介绍一种简洁、可扩展的实现方式。

定义观察者与主题接口

观察者模式包含两个主要角色:主题(Subject)和观察者(Observer)。主题维护一个观察者列表,并在状态变化时通知它们。

先定义接口:

type Event stringtype Observer interface {    OnNotify(Event)}type Subject interface {    Register(Observer)    Deregister(Observer)    Notify(Event)}

Event 是事件类型,用字符串标识不同事件。Observer 接口只需实现 OnNotify 方法接收事件。Subject 提供注册、注销和广播通知的能力。

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

实现事件中心(EventBus)

使用结构体实现 Subject 接口,作为全局事件中心:

type EventBus struct {    observers []Observer    mutex     sync.RWMutex}func NewEventBus() *EventBus {    return &EventBus{        observers: make([]Observer, 0),    }}func (bus *EventBus) Register(obs Observer) {    bus.mutex.Lock()    defer bus.mutex.Unlock()    bus.observers = append(bus.observers, obs)}func (bus *EventBus) Deregister(obs Observer) {    bus.mutex.Lock()    defer bus.mutex.Unlock()    for i, observer := range bus.observers {        if observer == obs {            bus.observers = append(bus.observers[:i], bus.observers[i+1:]...)            break        }    }}func (bus *EventBus) Notify(event Event) {    bus.mutex.RLock()    defer bus.mutex.RUnlock()    for _, obs := range bus.observers {        obs.OnNotify(event)    }}

使用 sync.RWMutex 保证并发安全。读操作(Notify)用读锁,写操作(Register/Deregister)用写锁,提升性能。

创建具体观察者

定义实际处理事件的观察者:

type Logger struct{}func (l *Logger) OnNotify(event Event) {    fmt.Printf("日志记录: %sn", event)}type Notifier struct{}func (n *Notifier) OnNotify(event Event) {    fmt.Printf("发送通知: %sn", event)}

每个观察者根据自身职责响应事件。比如 Logger 记录日志,Notifier 发送提醒。

使用示例

将各部分组合起来:

func main() {    bus := NewEventBus()    logger := &Logger{}    notifier := &Notifier{}    bus.Register(logger)    bus.Register(notifier)    bus.Notify("user.login")    bus.Deregister(notifier)    bus.Notify("user.logout")}

输出:

日志记录: user.login发送通知: user.login日志记录: user.logout

可以看到 notifier 在注销后不再接收事件。

基本上就这些。这种实现简单清晰,适合中小型项目中的事件通信。如需支持多种事件类型,可扩展为按事件名分类的多通道 EventBus。关键是保持接口简洁,避免过度设计。

以上就是如何用Golang实现观察者模式与事件通知_Golang 观察者模式事件实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1427730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
揭秘Go语言源码库早期提交之谜:一个C语言演进的彩蛋
上一篇 2025年12月16日 21:38:44
如何用Golang实现云原生应用配置管理_Golang 配置中心实践
下一篇 2025年12月16日 21:39:09

相关推荐

发表回复

登录后才能评论
关注微信