游戏编程模式04-设计模式-观察者模式
设计模式-观察者模式参考章节https://gpp.tkchu.me/observer.html脑内画面观察者模式让一个系统宣布“发生了某件事”而不需要知道谁在乎这件事。它像游戏世界里的公告牌物理系统贴出“角色开始坠落”成就、音效、教程系统各自来看公告牌不认识它们。音频系统成就系统事件发布点物理系统音频系统成就系统事件发布点物理系统Notify(EntityFell)OnNotify(EntityFell)OnNotify(EntityFell)它解决的问题如果物理代码里直接写Achievements.Unlock(...)物理系统就知道了成就系统的存在。观察者模式把这种依赖反过来成就系统主动订阅物理事件物理系统只负责通知。C# 示例publicsealedclassSubjectTEvent{privatereadonlyListActionTEvent_listenersnew();publicIDisposableSubscribe(ActionTEventlistener){_listeners.Add(listener);returnnewSubscription(()_listeners.Remove(listener));}publicvoidNotify(TEventgameEvent){foreach(varlistenerin_listeners.ToArray()){listener(gameEvent);}}privatesealedclassSubscription:IDisposable{privateAction?_dispose;publicSubscription(Actiondispose){_disposedispose;}publicvoidDispose(){_dispose?.Invoke();_disposenull;}}}publicreadonlyrecordstructEntityFell(intEntityId,boolIsHero);publicsealedclassPhysicsSystem{publicSubjectEntityFellEntityFell{get;}new();publicvoidSimulateFall(intentityId,boolisHero){EntityFell.Notify(newEntityFell(entityId,isHero));}}publicsealedclassAchievementSystem{privateIDisposable?_subscription;publicvoidConnect(PhysicsSystemphysics){_subscriptionphysics.EntityFell.Subscribe(OnEntityFell);}privatevoidOnEntityFell(EntityFelle){if(e.IsHero){Unlock(FellFromBridge);}}privatevoidUnlock(stringid){Console.WriteLine($Achievement unlocked:{id});}}什么时候用一个系统需要广播状态变化但不想依赖具体接收者。事件必须同步处理并且处理成本可控。订阅者数量不固定例如成就、统计、音效、教程。使用时的锋利边观察者默认是同步调用。发布者会等所有观察者执行完才继续所以观察者里不要做加载资源、网络请求、复杂寻路这类重操作。需要异步、跨线程、延迟处理时优先考虑事件队列。订阅也要有退出机制。C# 的事件和委托很容易因为忘记取消订阅导致对象无法被回收。

相关新闻

LDO稳压电路芯片选型

LDO稳压电路芯片选型

工作原理:DO通过负反馈回路调节输出电压。特点:适合小功率、纹波小、便宜、外围电路简单;LDO低压差线性稳压器与DC-DC直流转换器的区别:DC-DC:高效、适合大功率、外围电路复杂、贵。主要有四个核心选型参数&#xff1a…

2026/6/23 19:05:41阅读更多 →
vite+vue3 遇到报错 Uncaught SyntaxError: Cannot use import statement outside a module (at main.js:1:1)

vite+vue3 遇到报错 Uncaught SyntaxError: Cannot use import statement outside a module (at main.js:1:1)

在 Vue 3 项目&#xff08;特别是 Vite 项目&#xff09;中&#xff0c;index.html 里的 <script> 标签必须加上 type"module"。不加会导致程序无法运行。 核心区别&#xff1a;加与不加<script src"./src/main.ts"> (不加 type"module&q…

2026/6/23 19:00:41阅读更多 →
SpingMVC学习小记

SpingMVC学习小记

前言SpringMVC是Java后端面试必考高频知识点&#xff0c;不管是SpringBoot零基础开发&#xff0c;还是八股文面试&#xff0c;五大组件、执行流程、拦截器三大考点几乎必问。本文摒弃晦涩源码废话&#xff0c;用大白话流程链路拆解&#xff0c;零基础能看懂&#xff0c;面试直接…

2026/6/23 19:00:41阅读更多 →
ARM Cortex-M SPI通信深度解析:DSPI驱动配置、三种传输模式与实战调试

ARM Cortex-M SPI通信深度解析:DSPI驱动配置、三种传输模式与实战调试

1. 项目概述与DSPI驱动核心价值在嵌入式开发领域&#xff0c;尤其是基于ARM Cortex-M内核的微控制器项目里&#xff0c;与外设进行可靠、高效的通信是基本功。SPI&#xff08;Serial Peripheral Interface&#xff09;总线因其全双工、高速、协议简单的特点&#xff0c;成为了连…

2026/6/23 20:21:29阅读更多 →
DSP56303引导程序与寄存器配置实战:从启动到音频处理系统搭建

DSP56303引导程序与寄存器配置实战:从启动到音频处理系统搭建

1. 项目概述&#xff1a;从冷启动到应用就绪的基石 在嵌入式系统的世界里&#xff0c;每一次上电都像是一次新生。当电源接通&#xff0c;处理器从一片混沌的复位状态中苏醒&#xff0c;它做的第一件事是什么&#xff1f;它如何找到自己的“第一行代码”&#xff1f;这个问题的…

2026/6/23 20:21:29阅读更多 →
TV Bro:用遥控器轻松上网的Android电视浏览器终极指南

TV Bro:用遥控器轻松上网的Android电视浏览器终极指南

TV Bro&#xff1a;用遥控器轻松上网的Android电视浏览器终极指南 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro TV Bro是一款专为Android电视和电视盒子设计的开源智能…

2026/6/23 20:21:29阅读更多 →
终极免费方案:Icarus Verilog开源仿真工具完全实战指南

终极免费方案:Icarus Verilog开源仿真工具完全实战指南

终极免费方案&#xff1a;Icarus Verilog开源仿真工具完全实战指南 【免费下载链接】iverilog Icarus Verilog 项目地址: https://gitcode.com/gh_mirrors/iv/iverilog 还在为昂贵的商业EDA工具而犹豫不决&#xff1f;想要快速验证数字电路设计却找不到合适的免费解决方…

2026/6/23 20:21:29阅读更多 →
CodeWarrior中ARM GCC与EWL库配置实战:Kinetis项目构建与迁移指南

CodeWarrior中ARM GCC与EWL库配置实战:Kinetis项目构建与迁移指南

1. 项目概述&#xff1a;为什么要在CodeWarrior里折腾GCC和EWL&#xff1f; 搞嵌入式开发&#xff0c;尤其是用Freescale&#xff08;现在叫NXP&#xff09;Kinetis系列MCU的朋友&#xff0c;对CodeWarrior这个IDE肯定不陌生。早年它自带的编译器用起来挺顺手&#xff0c;但随着…

2026/6/23 20:21:29阅读更多 →
OpenRGB完整指南:告别多软件混乱,一站式控制所有RGB设备

OpenRGB完整指南:告别多软件混乱,一站式控制所有RGB设备

OpenRGB完整指南&#xff1a;告别多软件混乱&#xff0c;一站式控制所有RGB设备 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/Op…

2026/6/23 20:16:19阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM&#xff0c;WorkFlow&#xff0c;Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1&#xff09;LLM2&#xff09;Prompt3&#xff09;Me…

2026/6/23 7:04:52阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件&#xff1a;从原理到实战的深度解析在嵌入式系统开发中&#xff0c;图形用户界面&#xff08;GUI&#xff09;的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台&#xff0c;嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/23 1:55:32阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”&#xff0c;而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时&#xff0c;第一反应可能是&#xff1a;又一个免费额度&#xff1f;领完就完事&#xff1f;我亲手试过——这300美金根本不是红包&#xff0c;而是一张入场券&…

2026/6/23 5:55:37阅读更多 →
2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南。OpenClaw是开源的个人AI助手&#xff0c;Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流…

2026/6/23 0:00:38阅读更多 →
2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

模块一&#xff1a;行业背景——百亿赛道爆发&#xff0c;北京市场的特殊性与选型困局2026年&#xff0c;电子沙盘行业已走过“要不要做”的讨论&#xff0c;进入“找谁做、怎么做”的深水区。据行业研究机构数据&#xff0c;2025年国内电子沙盘市场规模已突破85亿元&#xff0…

2026/6/23 0:00:38阅读更多 →
音视频场景下的 Java 开发者面试:技术与挑战

音视频场景下的 Java 开发者面试:技术与挑战

面试互联网大厂&#xff1a;从音视频场景看 Java 开发者的技能与挑战 在互联网大厂求职的面试中&#xff0c;Java 开发者往往需要面对严苛的技术问题。今天&#xff0c;我们将通过一位名叫燕双非的搞笑程序员与严肃的面试官之间的对话&#xff0c;看看在音视频场景下&#xff0…

2026/6/23 0:00:38阅读更多 →