登录
首页 >  Golang >  Go教程

Golang观察者模式与事件机制详解

时间:2026-03-29 22:48:36 452浏览 收藏

本文深入讲解了如何在Golang中简洁、安全地实现观察者模式与事件系统,通过定义Observer和Subject接口、构建基于切片与sync.RWMutex的并发安全EventBus,以及创建Logger和Notifier等具体观察者,实现了发布者与订阅者之间的彻底解耦;代码结构清晰、扩展性强,既满足中小型项目的轻量级事件通信需求,又为支持多事件类型等进阶场景预留了良好设计空间,是Go开发者掌握响应式编程思想的实用入门范例。

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

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

定义观察者与主题接口

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

先定义接口:

type Event string

type Observer interface {
    OnNotify(Event)
}

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

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

实现事件中心(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("日志记录: %s\n", event)
}

type Notifier struct{}

func (n *Notifier) OnNotify(event Event) {
    fmt.Printf("发送通知: %s\n", 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学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>