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


观察者模式在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),它会在天气变化时通知所有注册的观察者:

AVCLabs *CLabs

AI移除视频背景,100%自动和免费

AVCLabs 337 查看详情 AVCLabs
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模式事件通知实践的详细内容,更多请关注其它相关文章!


# 这一  # SeO3的大 键  # 长宁区网站优化机构  # 奎文seo优化外包  # 巢湖网站外贸推广  # 乐山seo优化价格  # seo2.0  # 西安seo优化排名靠前  # 冕宁县建设村网站  # 美seo  # 澄城网站建设  # 相关文章  # 会在  # 是一种  # android  # 可行性分析  # 是一个  # 多语言  # 来实现  # 适用于  # 如何实现  # 应用开发  # ai  # iphone  # app  # go语言  # golang  # go 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 在J*a里什么是行为抽象_抽象行为对代码复用的提升作用  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  韩小圈网页版PC端入口 韩小圈网页版官方网站入口  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来  苹果如何下载nanobanana  优酷官网登录入口电脑版 优酷官网网址入口  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  OpenWeatherMap API:通过城市名称获取天气预报数据指南  B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】  C++ optional用法详解_C++17处理可能为空的返回值  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  J*aScript实现网页表单实时输入字段比较与验证教程  以下哪一个是适应长期护理制度发展而设立的新职业  抖音赚钱快速入门_新手必看的抖音赚钱步骤  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  附近酒吧怎么找?  微信网页版在线登录 微信网页版在线使用入口  《王者荣耀世界》英雄获取攻略  MacBook Pro词典使用指南  自定义你的VS Code状态栏,监控关键信息  在PySimpleGUI中实现键盘按键绑定按钮事件  以下哪一项是古代兵书三十六计中的计谋  Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏  Composer如何使用composer-plugin-api开发自定义插件  《爱笔思画x》涂色教程  C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树  《合金装备4》有望推出重制版!制作人发话了  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  百度识图图像分析 百度识图识别平台  《长生:天机降世》火塔小怪大全  msn官方入口2025登录 msn官网2025直达首页入口  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  windows10怎么开启卓越性能_windows10电源选项代码激活  抖音猜你想搜能说明对方搜过吗  Final Cut Pro视频加EQ教程  Apple Music无故扣费引质疑  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  《火花chat》搜索好友方法  《edge浏览器》关闭翻译功能方法  HTML中多图片上传与预览:解决ID冲突的专业指南  Python中对象引用与链表属性赋值的机制解析  PHP动态导航按钮:根据用户登录状态切换链接与文本  Go语言中方法接收器的选择:值类型还是指针类型?  《下一站江湖2》风神腿获取攻略 

 2025-12-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.