新闻中心

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

2025-12-05
浏览次数:
返回列表
观察者模式在Golang中通过接口与结构体实现一对多状态通知,核心为Subject维护Observer列表并支持注册、删除与广播,如WeatherStation在温度变化时通知PhoneDisplay和WebDisplay等观察者,利用Update方法接收消息,实现解耦与事件驱动,可结合sync.Mutex保障并发安全。

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

在Golang中实现观察者模式(Observer Pattern)是一种常见的解耦设计方式,适用于事件驱动场景,比如状态变更通知、消息广播等。该模式的核心是定义一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知。

观察者模式的基本结构

观察者模式包含两个主要角色:

  • Subject(被观察者):维护观察者列表,提供注册、删除和通知接口。
  • Observer(观察者):定义接收通知的接口,通常是一个方法,如 Update()。

在Go语言中,由于没有类的概念,我们通过接口和结构体组合来实现这一模式。

用接口定义观察者与被观察者

首先定义 Observer 接口和 Subject 接口:

type Observer interface {
    Update(message string)
}

type Subject interface {
    Register(obs Observer)
    Deregister(obs Observer)
    Notify(message string)
}

接下来实现一个具体的被观察者,例如一个天气站(WeatherStation),它会在天气变化时通知所有注册的观察者:

星辰Agent 星辰Agent

科大讯飞推出的智能体Agent开发平台,助力开发者快速搭建生产级智能体

星辰Agent 378 查看详情 星辰Agent
type WeatherStation struct {
    observers []Observer
    temperature float64
}

func (w *WeatherStation) Register(obs Observer) {
    w.observers = append(w.observers, obs)
}

func (w *WeatherStation) Deregister(obs Observer) {
    for i, o := range w.observers {
        if o == obs {
            w.observers = append(w.observers[:i], w.observers[i+1:]...)
            break
        }
    }
}

func (w *WeatherStation) Notify(message string) {
    for _, obs := range w.observers {
        obs.Update(message)
    }
}

func (w *WeatherStation) SetTemperature(temp float64) {
    w.temperature = temp
    w.Notify(fmt.Sprintf("Temperature changed to %.2f°C", temp))
}

实现具体的观察者

比如手机端和Web端显示天气信息:

type PhoneDisplay struct {
    name string
}

func (p *PhoneDisplay) Update(message string) {
    fmt.Printf("[%s] Received update: %s\n", p.name, message)
}

type WebDisplay struct{}

func (w *WebDisplay) Update(message string) {
    fmt.Println("[Web] Updating dashboard:", message)
}

使用示例

将观察者注册到被观察者,并触发事件:

func main() {
    station := &WeatherStation{}

    phone1 := &PhoneDisplay{name: "iPhone"}
    phone2 := &PhoneDisplay{name: "Android"}
    web := &WebDisplay{}

    station.Register(phone1)
    station.Register(phone2)
    station.Register(web)

    station.SetTemperature(25.5)
    // 输出:
    // [iPhone] Received update: Temperature changed to 25.50°C
    // [Android] Received update: Temperature changed to 25.50°C
    // [Web] Updating dashboard: Temperature changed to 25.50°C

    station.Deregister(phone2)
    station.SetTemperature(27.0)
    // 此时 Android 不再接收通知
}

这种实现方式简洁清晰,适用于大多数需要事件通知的场景。如果需要支持并发安全,可以在 Subject 中加入互斥锁(sync.Mutex)保护观察者列表的读写操作。

基本上就这些。Golang通过接口和组合轻松实现了观察者模式,无需复杂继承,适合现代应用开发中的松耦合需求。

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


# go  # 南充网站优化哪里有  # seo全网营销推广广告  # 马士基网站建设中国  # 企业网站建设详细步骤  # 涞源县网站推广推荐  # 如何推广微商网站赚钱快  # 设计网站推广首页  # 一站式推广营销  # seo2价格  # 相关文章  # 会在  # 是一种  # 这一  # 可行性分析  # 是一个  # 多语言  # 来实现  # 适用于  # 如何实现  # 应用开发  # ai  # iphone  # app  # go语言  # golang  # android  # 驻马店seo排名软件 


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


相关推荐: 在Runstone环境中高效处理TasteDive API的JSON数据  LINUX怎么设置定时任务_LINUX crontab配置教程  我的世界官方游戏入口 我的世界官网平台直达链接  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  Golang如何安装Swagger工具_GoSwagger文档生成环境  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  Python getattr() 异常处理深度解析:避免程序意外退出  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  J*aScript中管理异步API调用:确保操作顺序与数据一致性  必由学官方平台入口 必由学在线课堂登录地址  excel怎么制作工资条 excel快速生成工资条的方法  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  服务端验证_j*ascript输入检查  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  微博网页版直接访问 微博网页版账号管理快速入口  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  PySpark中从现有列右侧提取可变长度字符创建新列的教程  qq游戏手机版下载安装_qq游戏移动端入口  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  内存疯狂猛猛涨价:主板销量直接腰斩!  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  支付宝如何设置安全保护_支付宝安全设置的全面教程  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  CSS图片焦点样式实现教程:理解与应用tabindex属性  Pandas DataFrame:高效添加条件计算列  Win11怎么开启省电模式_Win11电池节电模式自动开启  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  从J*aScript对象中精确提取指定属性的教程  J*a应用程序首次运行自动创建文件与目录的最佳实践  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践 

搜索