当前位置: 首页 > news >正文

游戏编程模式04-设计模式-观察者模式

设计模式-观察者模式

参考章节:https://gpp.tkchu.me/observer.html

脑内画面

观察者模式让一个系统宣布“发生了某件事”,而不需要知道谁在乎这件事。它像游戏世界里的公告牌:物理系统贴出“角色开始坠落”,成就、音效、教程系统各自来看,公告牌不认识它们。

音频系统成就系统事件发布点物理系统音频系统成就系统事件发布点物理系统Notify(EntityFell)OnNotify(EntityFell)OnNotify(EntityFell)

它解决的问题

如果物理代码里直接写Achievements.Unlock(...),物理系统就知道了成就系统的存在。观察者模式把这种依赖反过来:成就系统主动订阅物理事件,物理系统只负责通知。

C# 示例

publicsealedclassSubject<TEvent>{privatereadonlyList<Action<TEvent>>_listeners=new();publicIDisposableSubscribe(Action<TEvent>listener){_listeners.Add(listener);returnnewSubscription(()=>_listeners.Remove(listener));}publicvoidNotify(TEventgameEvent){foreach(varlistenerin_listeners.ToArray()){listener(gameEvent);}}privatesealedclassSubscription:IDisposable{privateAction?_dispose;publicSubscription(Actiondispose){_dispose=dispose;}publicvoidDispose(){_dispose?.Invoke();_dispose=null;}}}publicreadonlyrecordstructEntityFell(intEntityId,boolIsHero);publicsealedclassPhysicsSystem{publicSubject<EntityFell>EntityFell{get;}=new();publicvoidSimulateFall(intentityId,boolisHero){EntityFell.Notify(newEntityFell(entityId,isHero));}}publicsealedclassAchievementSystem{privateIDisposable?_subscription;publicvoidConnect(PhysicsSystemphysics){_subscription=physics.EntityFell.Subscribe(OnEntityFell);}privatevoidOnEntityFell(EntityFelle){if(e.IsHero){Unlock("FellFromBridge");}}privatevoidUnlock(stringid){Console.WriteLine($"Achievement unlocked:{id}");}}

什么时候用

  • 一个系统需要广播状态变化,但不想依赖具体接收者。
  • 事件必须同步处理,并且处理成本可控。
  • 订阅者数量不固定,例如成就、统计、音效、教程。

使用时的锋利边

观察者默认是同步调用。发布者会等所有观察者执行完才继续,所以观察者里不要做加载资源、网络请求、复杂寻路这类重操作。需要异步、跨线程、延迟处理时,优先考虑事件队列。

订阅也要有退出机制。C# 的事件和委托很容易因为忘记取消订阅导致对象无法被回收。

http://www.jsqmd.com/news/1068817/

相关文章:

  • 信创数据库选型:为什么Oracle兼容性比性能跑分更影响迁移成败?
  • 2B参数Spatial-TTT入选ECCV 2026,长视频处理与空间推理能力领先,节省超40%显存与计算
  • 客服机器人什么算好?电商AI客服系统选型,90%的商家都踩过这7个坑!
  • 网络变压器头部企业如于都县昇达电子制造有限公司(前身为诚鑫电子)对绝缘电阻和介质耐压测试实行100%批次全检
  • AI手势识别+手势控制系统 OpenCV+Python(源码和教程)
  • 从机器翻译到智驾:规则派的黄昏与数据革命的终局
  • AI Agent 智能体是什么
  • SITS 2026注意力熵图+时序归因热力图+token级干预沙盒(三合一原生可视化套件首次解密,含NASA与DeepMind联合验证数据集)
  • 上海闵行区无增项闭口合同的公寓装修公司
  • 一个完善的网络验证系统需要具备哪些核心功能?
  • 山东大学软件学院创新实训——MarketClaw(八):从功能点到平台——我的整合视角
  • 资深SEO亲测:这几款GEO排名工具,免费版也能打!别再迷信“越贵越好”
  • 医院查不出毛病却浑身难受?45岁姐姐的真实改变
  • 为什么有的人越挫越勇,有的人一蹶不振?答案藏在一个被忽视的指标里
  • 【路径规划】整合ACO和FMO的算法机器人路径规划(采用五次PH曲线进行路径平滑)【含Matlab源码 15655期】
  • Abaqus 2026使用教程Abaqus有限元仿真软件下载安装教程
  • 游戏编程模式19-优化模式-对象池模式
  • 如何搭建SaaS自动分佣系统?一文讲清2026联盟分佣的运作逻辑
  • 【opencv】OpenCV 图像增强实战:直方图均衡化与 CLAHE 原理及代码详解
  • 工作测试方法复盘(修改重传版)
  • 现场停线没人理?这套安灯管理系统经验,让响应速度直接翻倍
  • Spring AI 实战指南(十二):MCP(Model Context Protocol)企业级落地与 AI 工具生态构建
  • 【Ble】(15)ble入门
  • 维生素b可以长期吃吗?高仕星维生素b安全性解
  • LDO稳压电路芯片选型
  • Linux配置网络
  • 【重要置顶】关于博主介绍以及源码获取方式
  • 2026高考志愿填报(本科+专科)免费分享
  • 为什么学嵌入式软件一年,还是找不到汽车软件工作?
  • android compose Card 卡片 使用