設計模式 --- 觀察者模式

觀察者模式是一種行為設計模式,它定義了對象之間的一對多依賴關系,當一個對象的狀態發生改變時,所有依賴它的對象都會得到通知并自動更新。

優點:

??1.解耦性強??
??觀察者(訂閱者)與主題(發布者)通過抽象接口通信,不直接依賴具體實現,??修改主題或觀察者的代碼時,無需影響對方,提升代碼可維護性。
2.??動態訂閱機制??
??觀察者可隨時注冊或注銷,運行時靈活調整事件響應,支持熱插拔功能,增強系統擴展性。
3.??一對多通信高效??
一個主題狀態變化可同時通知多個觀察者,避免重復調用邏輯,提升事件處理效率。
??4.支持事件驅動架構??
通過事件總線(Event Bus)實現全局通信, ??簡化跨模塊通信,適合復雜系統交互。

缺點:

1.?性能開銷??:
高頻事件(如每幀更新)或大量觀察者時,遍歷通知列表耗時(物理引擎的CollisionEvent在百個對象碰撞時,觸發千次通知)。
??優化??
1.使用事件合并(如積累多次位置更新后批量通知)。
2.異步處理(將事件推送到隊列,分幀處理)。
2.??內存泄漏風險??:
??觀察者未正確注銷時,Subject(主題者)持有其引用導致無法回收(Unity中,UI面板銷毀前未取消訂閱事件)。
??優化??
使用弱引用(WeakReference)或者使用擴展方法在MonoBehaviour綁定取消事件注冊的方法,使其在OnDestroy時調用取消注冊方法。

public static void UnregisterOnDestroy(this MonoBehaviour obj, Action unsubscribe) {obj.gameObject.AddComponent<OnDestroyDispatcher>().OnDestroyEvent += unsubscribe;
}class OnDestroyDispatcher : MonoBehaviour {public event Action OnDestroyEvent;void OnDestroy() => OnDestroyEvent?.Invoke();
}

注:弱引用的使用 (會加一篇Unity中弱引用的測試使用的文章)。
3.??事件順序不可控??:
??觀察者處理事件的順序依賴注冊順序,可能導致邏輯錯誤。
??優化??:
引入優先級字段,按優先級排序觀察者。
4.?調試困難??:
??問題??:事件流分散,難以追蹤事件觸發源頭和傳遞鏈路。
??優化??:
添加事件日志:記錄每個事件的發布者和訂閱者。

說明例子:

1.UML圖:

2.實現:

1.實現Subject(主題者)基類:

    public abstract class Subject{List<Observer> m_Observers = new List<Observer>();//加入觀察者public void Attach(Observer theObserver){m_Observers.Add(theObserver);}//刪除觀察者public void Detach(Observer theObserver){m_Observers.Remove(theObserver);}//通知所有觀察者public void Notify(){foreach (Observer theObserver in m_Observers){theObserver.Update();}}}

2.實現Observer(觀察者)基類:

    public abstract class Observer{public abstract void Update();}

3.實現具體Subject:

    public class ConcreteSubject : Subject{string m_SubjectState;public void SetState(string state){this.m_SubjectState = state;this.Notify();}public string GetState(){return this.m_SubjectState;}}

4.實現具體Observer:

   //實現Observer1public class ConcreteObserver1 : Observer{ConcreteSubject m_Subject = null;public ConcreteObserver1(ConcreteSubject theSubject){this.m_Subject = theSubject;}public override void Update(){Debug.Log("ConcreteObserver1.Update");//獲取Subject狀態Debug.Log("ConcreteObserver1 : Subject 當前主題:" + m_Subject.GetState());}}//實現Observer2public class ConcreteObserver2 : Observer{ConcreteSubject m_Subject = null;public ConcreteObserver2(ConcreteSubject theSubject){this.m_Subject = theSubject;}public override void Update(){Debug.Log("ConcreteObserver2.Update");//獲取Subject狀態Debug.Log("ConcreteObserver2 : Subject 當前主題:" + m_Subject.GetState());}}

游戲中使用場景:

??1.成就/統計系統??:監聽關鍵游戲事件(擊殺、死亡、收集)--->玩家擊殺Boss后解鎖成就。
??2.UI更新??:將UI元素與游戲數據解耦--->血量變化時自動刷新血條UI。
??3.跨系統通信??:避免系統間直接引用--->背包系統物品使用后通知技能系統。
??4.AI行為觸發??:基于事件觸發的敵人反應---->玩家進入警戒范圍觸發敵人警報。
??5.網絡同步??:將本地事件廣播給其他客戶端--->玩家位置同步事件。

總結:

觀察者模式的核心價值??在于解耦和動態通信,但其性能、內存和調試問題需謹慎處理。
在游戲開發中,觀察者模式適用于以下場景:
1.需要松耦合的跨系統通信。
2.需要動態處理大量事件類型
3.需要支持模塊化擴展(如MOD系統)。

參考書籍:

《Hands-On Game Development Patterns with Unity 2019》

《設計模式與游戲完美開發》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79108.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PasteForm框架開發之Entity多級嵌套的表單的實現

你相信么,使用PasteForm框架開發&#xff0c;管理端居然不要寫代碼&#xff01;&#xff01;&#xff01; 一起來看看PasteForm是否支持多級表模式(外表) 需求假設 假如有這么一個需求&#xff0c;就是訂單表&#xff0c;包含了多級的信息&#xff0c;比如這個訂單包含了哪些…

深入解析分類模型評估指標:ROC曲線、AUC值、F1分數與分類報告

標題&#xff1a;深入解析分類模型評估指標&#xff1a;ROC曲線、AUC值、F1分數與分類報告 摘要&#xff1a; 在機器學習中&#xff0c;評估分類模型的性能是至關重要的一步。本文詳細介紹了四個核心評估指標&#xff1a;ROC曲線、AUC值、F1分數和分類報告。通過對比這些指標…

多模態醫學AI框架Pathomic Fusion,整合了組織病理學與基因組的特征

小羅碎碎念 在醫學AI領域&#xff0c;癌癥的精準診斷與預后預測一直是關鍵研究方向。 這篇文章提出了Pathomic Fusion這一創新框架&#xff0c;致力于解決現有方法的局限。 傳統上&#xff0c;癌癥診斷依賴組織學與基因組數據&#xff0c;但組織學分析主觀易變&#xff0c;基因…

《Python星球日記》第27天:Seaborn 可視化

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 專欄&#xff1a;《Python星球日記》&#xff0c;限時特價訂閱中ing 目錄 一、Seabor…

【scikit-learn基礎】--『監督學習』之 決策樹回歸

決策樹算法是一種既可以用于分類&#xff0c;也可以用于回歸的算法。 決策樹回歸是通過對輸入特征的不斷劃分來建立一棵決策樹&#xff0c;每一步劃分都基于當前數據集的最優劃分特征。 它的目標是最小化總體誤差或最大化預測精度&#xff0c;其構建通常采用自上而下的貪心搜索…

解決安卓開發“No Android devices detected.”問題

解決安卓開發“No Android devices detected.”問題 ? 當我們插入移動設備的USB時&#xff0c;卻發現這并未顯示已連接到的設備 點擊右側的Assistant,根據提示打開移動設備開發者模式并啟用USB調試模式,然后發現我們未連接到移動設備的原因是ABD服務的原因 問題確定了&…

idea如何使用git

在 IntelliJ IDEA 中使用 Git 的詳細步驟如下&#xff0c;分為配置、基礎操作和高級功能&#xff0c;適合新手快速上手&#xff1a; ?一、配置 Git? ?安裝 Git? 下載并安裝 Git&#xff0c;安裝時勾選“Add to PATH”。驗證安裝&#xff1a;終端輸入 git --version 顯示版本…

軟件架構設計:MVC、MVP、MVVM、RIA 四大風格優劣剖析

MVC、MVP、MVVM 和 RIA 都是軟件架構中常見的設計風格&#xff0c;以下是對它們的詳細介紹&#xff1a; 一、MVC 架構風格&#xff08;Model - View - Controller&#xff09; 1.簡介&#xff1a;MVC 架構風格將軟件應用程序分為三個核心部分&#xff0c;通過這種劃分來分離不…

Centos/RedHat 7.x服務器掛載ISCSI存儲示例(無多路徑非LVM)

客戶讓幫忙掛載個ISCSI存儲&#xff0c;大概結構如下圖所示&#xff1a; ISCSI存儲為一臺安裝了truenas的X86服務器&#xff0c;提供存儲服務的IP地址為10.16.0.1 服務器的ETH1網卡配置與10.16.0.1同段網絡。 為了給客戶做個簡單培訓&#xff0c;整理了一下操作步驟。下面是配…

TV板卡維修技術【二】

【一】測量未知MOS引腳定義的好壞 TO-252封裝的MOS管子&#xff0c;上面的大焊盤是D極&#xff0c;下面的3個不同品牌的NMOS或者PMOS驗證了這個結論&#xff1a; 利用這個特性&#xff0c;可以在不知道MOS引腳定義的情況下測量出MOS的好壞&#xff0c;如下圖&#xff1a; 插件…

基于 cefpython 實現嵌入 Chromium (CEF)

CEF Python是一個開源項目&#xff0c;旨在為Chromium Embedded Framework提供Python綁定&#xff0c;許多流行的GUI工具包都提供了嵌入CEF瀏覽器&#xff0c;例如QT。 安裝 pip install cefpython366.1支持的Python版本&#xff1a; 實現打開網頁 from cefpython3 import…

MySQL-存儲引擎和索引

1.MySQL的基礎架構是什么&#xff1f; MySQL由連接器、分析器、優化器、執行器和存儲引擎這五部分構成。 一條SQL的執行流程&#xff1a; 通過連接器連接數據庫&#xff0c;檢查用戶名和密碼&#xff0c;以及權限校驗&#xff0c;是否有增刪改查的權限。在MySQL8.0之前&#…

安卓性能調優之-掉幀測試

掉幀指的是某一幀沒有在規定時間內完成渲染&#xff0c;導致 UI 畫面不流暢&#xff0c;產生視覺上的卡頓、跳幀現象。 Android目標幀率&#xff1a; 一般情況下&#xff0c;Android設備的屏幕刷新率是60Hz&#xff0c;即每秒需要渲染60幀&#xff08;Frame Per Second, FPS&a…

【運維自動化-標準運維】職能化功能如何使用?

職能化功能主要用于一些固化的標準流程可以通過權限開放的方式給到那些負責固定職能的非運維人員&#xff0c;比如外包操作員來執行操作&#xff0c;如此可以釋放一些運維的人力&#xff0c;讓其可以專注流程的建設和優化。實操演示 新建職能化流程&#xff08;運維角色操作&a…

游戲引擎學習第224天

回顧游戲運行并指出一個明顯的圖像問題。 回顧一下之前那個算法 我們今天要做一點預加載的處理。上周剛完成了游戲序章部分的所有剪輯內容。在運行這一部分時&#xff0c;如果觀察得足夠仔細&#xff0c;就會注意到一個問題。雖然因為視頻流壓縮質量較低&#xff0c;很難清楚…

【小沐學GIS】基于C++繪制三維數字地球Earth(QT5、OpenGL、GIS、衛星)第五期

&#x1f37a;三維數字地球系列相關文章如下&#x1f37a;&#xff1a;1【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐學GIS】…

OpenAI 最新發布的 GPT-4.1 系列在 API 中正式上線

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

【力扣】day1

文章目錄 27.移除元素26. 刪除有序數組的重復項 27.移除元素 26. 刪除有序數組的重復項 我們仔細看一下這兩道題的最后的返回值,為什么第一題返回slow 而第二題返回slow1 最后的返回值該如何返回絕對不是憑感覺,我們自己分析一下第一個slow,從0位置開始, 遇到val值就開始和fas…

完全無網絡環境的 openEuler 系統離線安裝 ClamAV 的詳細步驟

準備工作&#xff08;在外網機器操作&#xff09; 1. 下載 ClamAV RPM 包及依賴 mkdir -p ~/clamav-offline/packages cd ~/clamav-offline/packages# 使用 yumdownloader 下載所有依賴包&#xff08;需提前安裝 yum-utils&#xff09; sudo dnf install yum-utils -y sudo y…

3.2.2.2 Spring Boot配置視圖控制器

在Spring Boot中配置視圖控制器可以簡化頁面跳轉跳邏輯。通過實現WebMvcConfigurer接口的addViewControllers方法&#xff0c;可以直接將URL映射到特定的視圖&#xff0c;而無需編寫控制器類。例如&#xff0c;將根路徑"/"映射到welcome.html視圖&#xff0c;當訪問應…