新闻中心

如何在Golang中实现观察者模式多对象通知

2025-10-30
浏览次数:
返回列表
在Golang中通过接口和组合实现观察者模式,定义Observer和Subject接口,用EventNotifier管理观察者列表并通知,Logger和Emailer实现具体响应,支持灵活扩展与解耦。

如何在golang中实现观察者模式多对象通知

在Golang中实现观察者模式进行多对象通知,核心是定义一个主题(Subject)来管理观察者列表,并在状态变化时通知所有观察者。Go没有类和继承,但通过接口和组合能简洁实现该模式。

定义观察者与主题接口

观察者模式依赖两个主要组件:观察者(Observer)和被观察的主题(Subject)。先定义接口:

type Observer interface {

    Update(message string)

}

type Subject interface {

    Register(Observer)

    Deregister(Observer)

    Notify(message string)

}

Observer 接口要求实现 Update 方法接收通知。Subject 接口管理观察者注册、注销和广播消息。

实现主题结构体

创建一个具体主题,比如 EventNotifier,维护观察者列表并实现 Subject 接口:

type EventNotifier struct {

    observers []Observer

}

func (e *EventNotifier) Register(o Observer) {

    e.observers = append(e.observers, o)

}

func (e *EventNotifier) Deregister(o Observer) {

    for i, obs := range e.observers {

        if obs == o {

            e.observers = append(e.observers[:i], e.observers[i+1:]...)

            break

        }

    }

}

func (e *EventNotifier) Notify(message string) {

    for _, observer := range e.observers {

Pinokio Pinokio

Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用

Pinokio 232 查看详情 Pinokio

        observer.Update(message)

    }

}

这个结构体用切片保存观察者,Notify 遍历调用每个观察者的 Update 方法。

实现多个观察者

定义几种不同行为的观察者,比如日志记录器和邮件通知器:

type Logger struct{}

func (l *Logger) Update(msg string) {

    fmt.Println("日志记录:", msg)

}

type Emailer struct{}

func (e *Emailer) Update(msg string) {

    fmt.Println("发送邮件:", msg)

}

这些结构体实现了 Observer 接口,在收到通知时执行各自逻辑。

使用示例

将主题与多个观察者组合使用:

notifier := &EventNotifier{}

logger := &Logger{}

emailer := &Emailer{}

notifier.Register(logger)

notifier.Register(emailer)

notifier.Notify("系统发生异常")

输出结果:

日志记录: 系统发生异常

发送邮件: 系统发生异常

任意数量的观察者都可以注册,主题状态变化时全部收到通知。

基本上就这些。通过接口解耦,Go中的观察者模式灵活且易于扩展。实际项目中可结合 channel 实现异步通知,避免阻塞主流程。

以上就是如何在Golang中实现观察者模式多对象通知的详细内容,更多请关注其它相关文章!


# 中文网  # 宜良快手营销推广电话  # 怎么推广网站运营商  # 张店网站建设企业  # 网络营销推广实训平台  # 人人都可以是seo  # 海外美妆推广网站推荐  # 手机关键词seo排名优化  # 龙岗网站建设营销策划  # 恩施品牌推广网站有哪些  # 涿州抖音seo定制招聘  # 几种  # go  # 相关文章  # 并在  # 遍历  # 记录器  # 移除  # 发送邮件  # 多个  # 如何在  # ai  # app  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: React Router 嵌套组件中 URL 重定向问题的解决方案  《刺客信条:影》PS5 Pro和Switch 2画面对比  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  Typer应用中动态命令行参数的解析与处理  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Promise错误处理:在catch后终止链式then执行的策略  AI泡沫首次被“刺破”:GPU十年都无法存活!  J*aScript 字符串标签转换:使用正则表达式高效替换  大麦的“候补”是什么意思 大麦候补购票规则【详解】  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  深入理解与实现最大堆的Heapify过程:常见错误与修正  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  解决J*aScript中重复选择项的确认对话框显示问题  C++指针和引用有什么区别_C++内存管理核心概念深度解析  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  Win11网速慢怎么解决 Win11网络设置优化解除限速  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  生成rdflib自定义SPARQL函数:参数匹配与实践指南  Go Martini框架:动态服务解码后的图片内容  Composer如何在生产环境安全地执行composer update  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  AO3访问入口汇总 AO3网页版同人作品一键直达  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  c++中为什么推荐使用using替代typedef_c++现代化类型别名  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  Django通过AJAX异步上传图片并保存至模型的完整指南  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  京东单号查询入口_京东快递订单追踪入口  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  HTML空白字符处理机制:渲染、DOM与编码实践  Go语言JSON解析深度指南:动态访问与结构体映射实践  mysql如何设置表访问权限_mysql表访问权限配置  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  在Runstone环境中高效处理TasteDive API的JSON数据  蛙漫移动版在线看 蛙漫手机浏览器直达入口  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  C++ explicit关键字防止隐式转换_C++构造函数安全规范  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】 

搜索