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

在 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
微信扫一扫
支付宝扫一扫