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

发布时间:2026/6/23 19:05:23

游戏编程模式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# 的事件和委托很容易因为忘记取消订阅导致对象无法被回收。

相关新闻