首页 > 后端开发 > Golang > 正文

Golang Observer观察者模式事件通知示例

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

golang observer观察者模式事件通知示例

在 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("订单已创建")
}
登录后复制

输出结果:

知我AI·PC客户端
知我AI·PC客户端

离线运行 AI 大模型,构建你的私有个人知识库,对话式提取文件知识,保证个人文件数据安全

知我AI·PC客户端 0
查看详情 知我AI·PC客户端
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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号