【行為型之中介者模式】游戲開發實戰——Unity復雜系統協調與通信架構的核心秘訣

文章目錄

      • 🕊? 中介者模式(Mediator Pattern)深度解析
        • 一、模式本質與核心價值
        • 二、經典UML結構
        • 三、Unity實戰代碼(成就系統協調)
          • 1. 定義中介者接口與同事基類
          • 2. 實現具體同事類
          • 3. 實現具體中介者
          • 4. 客戶端使用
        • 四、模式進階技巧
          • 1. 事件總線集成
          • 2. 狀態依賴管理
          • 3. 優先級路由
        • 五、游戲開發典型應用場景
        • 六、性能優化策略
        • 七、模式對比與選擇
        • 八、最佳實踐原則
        • 九、常見問題解決方案

🕊? 中介者模式(Mediator Pattern)深度解析

——以Unity實現跨系統通信復雜UI協調為核心案例


一、模式本質與核心價值

核心目標
? 解耦對象間的直接依賴,通過中介者集中管理交互
? 簡化網狀通信為星型結構,提升系統可維護性
? 統一控制交互邏輯,便于擴展新通信規則

關鍵術語

  • Mediator(中介者接口):定義對象間通信的接口
  • ConcreteMediator(具體中介者):實現協調邏輯
  • Colleague(同事類):需要交互的對象,依賴中介者

數學表達
設有N個對象,原始耦合度為O(N2),引入中介者M后降為O(N)


二、經典UML結構
?interface?
IMediator
+Notify(sender: object, event: string)
AchievementMediator
+Notify()
UIColleague
-mediator: IMediator
+OnUpdate()
AchievementSystem
-mediator: IMediator
+UnlockAchievement()

三、Unity實戰代碼(成就系統協調)
1. 定義中介者接口與同事基類
public interface IMediator {void Notify(object sender, string eventType, object data = null);
}public abstract class Colleague : MonoBehaviour {[SerializeField] protected IMediator mediator;public void SetMediator(IMediator mediator) {this.mediator = mediator;}
}
2. 實現具體同事類
// 成就系統
public class AchievementSystem : Colleague {public void Unlock(string achievementID) {Debug.Log($"解鎖成就:{achievementID}");mediator?.Notify(this, "AchievementUnlocked", achievementID);}
}// UI彈窗系統
public class UIPopup : Colleague {public void ShowAchievementPopup(string title) {Debug.Log($"顯示成就彈窗:{title}");}
}// 音效系統
public class SFXSystem : Colleague {public void Play(string clipName) {Debug.Log($"播放音效:{clipName}");}
}
3. 實現具體中介者
public class AchievementMediator : IMediator {private AchievementSystem _achievement;private UIPopup _popup;private SFXSystem _sfx;public AchievementMediator(AchievementSystem a, UIPopup u, SFXSystem s) {_achievement = a;_popup = u;_sfx = s;_achievement.SetMediator(this);_popup.SetMediator(this);_sfx.SetMediator(this);}public void Notify(object sender, string eventType, object data) {switch(eventType) {case "AchievementUnlocked":HandleAchievementUnlocked(data.ToString());break;case "PopupClosed":HandlePopupClosed();break;}}private void HandleAchievementUnlocked(string id) {_popup.ShowAchievementPopup(GetAchievementTitle(id));_sfx.Play("AchievementUnlocked");SaveSystem.SaveAchievement(id);}private void HandlePopupClosed() {_sfx.Play("ButtonClick");}
}
4. 客戶端使用
public class GameManager : MonoBehaviour {[SerializeField] private AchievementSystem achievement;[SerializeField] private UIPopup popup;[SerializeField] private SFXSystem sfx;private IMediator _mediator;void Start() {_mediator = new AchievementMediator(achievement, popup, sfx);}void Update() {if(Input.GetKeyDown(KeyCode.A)) {achievement.Unlock("KILL_100_ENEMIES");}}
}

四、模式進階技巧
1. 事件總線集成
public class EventMediator : IMediator {private Dictionary<Type, List<Action<object>>> _handlers = new();public void Subscribe<T>(Action<T> handler) {var type = typeof(T);if(!_handlers.ContainsKey(type)) {_handlers[type] = new List<Action<object>>();}_handlers[type].Add(obj => handler((T)obj));}public void Notify(object sender, string eventType, object data) {if(_handlers.TryGetValue(data.GetType(), out var handlers)) {foreach(var h in handlers) h(data);}}
}
2. 狀態依賴管理
public class StateDependentMediator : IMediator {private Dictionary<GameState, Action<object>> _stateHandlers = new();public void RegisterStateHandler(GameState state, Action<object> handler) {_stateHandlers[state] = handler;}public void Notify(object sender, string eventType, object data) {if(_stateHandlers.TryGetValue(GameManager.CurrentState, out var handler)) {handler(data);}}
}
3. 優先級路由
public class PriorityMediator : IMediator {private List<(int priority, Action<object>)> _handlers = new();public void AddHandler(int priority, Action<object> handler) {_handlers.Add((priority, handler));_handlers.Sort((a,b) => b.priority.CompareTo(a.priority));}public void Notify(object sender, string eventType, object data) {foreach(var h in _handlers) {h.handler(data);}}
}

五、游戲開發典型應用場景
  1. UI系統協調

    public class UIMediator : IMediator {public void Notify(object sender, string eventType) {switch(eventType) {case "InventoryOpened":PauseGame();HideHUD();break;case "SettingsClosed":ResumeGame();ShowHUD();break;}}
    }
    
  2. 多人游戲同步

    public class NetworkMediator : IMediator {public void Notify(object sender, string eventType, object data) {switch(eventType) {case "PlayerMove":BroadcastToAllClients(data);break;case "ChatMessage":ProcessChatMessage(data);break;}}
    }
    
  3. 任務系統協調

    public class QuestMediator : IMediator {public void Notify(object sender, string eventType, Quest quest) {switch(eventType) {case "QuestStarted":UpdateQuestLog();PlayQuestStartSFX();break;case "QuestCompleted":GrantRewards();UpdateNPCdialogue();break;}}
    }
    
  4. 車輛控制系統

    public class VehicleMediator : IMediator {public void Notify(object sender, string eventType) {if(sender is Engine && eventType == "Overheat") {ThrottleControl.ReducePower();CoolingSystem.ActivateEmergencyCooling();}}
    }
    

六、性能優化策略
策略實現方式適用場景
事件過濾提前終止不相關事件處理高頻事件系統
批處理合并多個通知為單個操作物理系統更新
緩存路由表預生成事件處理映射固定事件類型
異步處理使用UniTask處理耗時操作網絡通信場景

七、模式對比與選擇
維度中介者模式觀察者模式
關注點集中協調松散通知
耦合度同事類依賴中介者發布者/訂閱者解耦
復雜度較高(需維護中介者)較低
典型場景復雜交互協調簡單事件通知

八、最佳實踐原則
  1. 職責分離:避免中介者成為"上帝對象"
  2. 接口最小化
    public interface IGameMediator {void PlayerAction(PlayerActionType action);void UIEvent(UIEventType event);
    }
    
  3. 模塊化中介者
    public class CompositeMediator : IMediator {private List<IMediator> _subMediators = new();public void AddMediator(IMediator m) => _subMediators.Add(m);public void Notify(object sender, string eventType, object data) {foreach(var m in _subMediators) m.Notify(sender, eventType, data);}
    }
    
  4. 異常隔離
    public void Notify(...) {try {// 處理邏輯} catch(Exception e) {Debug.LogError($"中介者處理異常:{e.Message}");}
    }
    

九、常見問題解決方案

Q1:如何防止中介者過度膨脹?
→ 實現分層中介者

public class HierarchyMediator : IMediator {private Dictionary<SystemType, IMediator> _subMediators = new();public void Notify(...) {if(_subMediators.TryGetValue(GetSystemType(sender), out var mediator)) {mediator.Notify(sender, eventType, data);}}
}

Q2:如何處理循環通知?
→ 實現事件標記

public class Notification {public string Type;public bool IsProcessed;
}public void Notify(...) {if(notification.IsProcessed) return;notification.IsProcessed = true;// 處理邏輯
}

Q3:如何調試復雜事件流?
→ 實現事件追蹤器

public class DebugMediator : IMediator {public void Notify(object sender, string eventType, object data) {Debug.Log($"[{Time.time}] 事件:{eventType} 發送者:{sender.GetType().Name}");// 傳遞給實際中介者...}
}

上一篇 【行為型之迭代器模式】游戲開發實戰——Unity高效集合遍歷與場景管理的架構精髓
下一篇 【行為型之備忘錄模式】游戲開發實戰——Unity存檔系統與狀態管理的終極解決方案

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

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

相關文章

【網工第6版】第10章 網絡規劃和設計②

目錄 ■ 網絡分析與設計 ◆ 網絡規劃設計模型 ◆ 網絡設計的約束因素 ◆ 技術評價 ■ 網絡結構與功能 ◆ 局域網結構類型 ■ 網絡冗余設計 ◆ 網絡冗余設計-備用路徑 ◆ 網絡冗余設計-負載分擔 ■ 廣域網接入技術 ◆ 廣域網接入技術 ◆ 接入和終結設備 ■ 網絡分析…

PowerBI鏈接EXCEL實現自動化報表

PowerBI鏈接EXCEL實現自動化報表 曾經我將工作中一天的工作縮短至2個小時&#xff0c;其中最關鍵的一步就是使用PowerBI鏈接Excel做成一個自動化報表&#xff0c;PowerBI更新源數據&#xff0c;Excel更新報表并且保留報表格式。 以制作一個超市銷售報表為例&#xff0c;簡單敘…

C#.NET 或 VB.NET Windows 窗體中的 DataGridView – 技巧、竅門和常見問題

DataGridView 控件是一個 Windows 窗體控件&#xff0c;它允許您自定義和編輯表格數據。它提供了許多屬性、方法和事件來自定義其外觀和行為。在本文中&#xff0c;我們將討論一些常見問題及其解決方案。這些問題來自各種來源&#xff0c;包括一些新聞組、MSDN 網站以及一些由我…

表記錄的檢索

1.select語句的語法格式 select 字段列表 from 表名 where 條件表達式 group by 分組字段 [having 條件表達式] order by 排序字段 [asc|desc];說明&#xff1a; from 子句用于指定檢索的數據源 where子句用于指定記錄的過濾條件 group by 子句用于對檢索的數據進行分組 ha…

能源設備數據采集

在全球可持續發展目標與環境保護理念日益深入人心的時代背景下&#xff0c;有效管理和優化能源使用已成為企業實現綠色轉型、提升競爭力的關鍵路徑。能源設備數據采集系統&#xff0c;作為能源管理的核心技術支撐&#xff0c;通過對各類能源生產設備運行數據的全面收集、深度分…

【鴻蒙開發】性能優化

語言層面的優化 使用明確的數據類型&#xff0c;避免使用模糊的數據類型&#xff0c;例如ESObject。 使用AOT模式 AOT就是提前編譯&#xff0c;將字節碼提前編譯成機器碼&#xff0c;這樣可以充分優化&#xff0c;從而加快執行速度。 未啟用AOT時&#xff0c;一邊運行一邊進…

群暉NAS部署PlaylistDL音樂下載器結合cpolar搭建私有云音樂庫

文章目錄 前言1.關于PlaylistDL音樂下載器2.Docker部署3.PlaylistDL簡單使用4.群暉安裝Cpolar工具5.創建PlaylistDL音樂下載器的公網地址6.配置固定公網地址總結 前言 各位小伙伴們&#xff0c;你們是不是經常為了聽幾首歌而開通各種平臺的VIP&#xff1f;或者為了下載無損音質…

REST架構風格介紹

一.REST&#xff08;表述性狀態轉移&#xff09; 1.定義 REST&#xff08;Representational State Transfer&#xff09;是由 Roy Fielding 在 2000 年提出的一種軟件架構風格&#xff0c;用于設計網絡應用的通信模式。它基于 HTTP 協議&#xff0c;強調通過統一的接口&#…

計算機視覺----基于錨點的車道線檢測、從Line-CNN到CLRNet到CLRKDNet 本文所提算法Line-CNN 后續會更新以下全部算法

本文所提算法如下&#xff1a; 敘述按時間順序 你也可以把本文當作快速閱讀這幾篇文獻的一個途徑 所有重要的部分我都已經標注并弄懂其原理 方便自己也是方便大家 Line-CNN&#xff1a;基于線提議單元的端到端交通線檢測 摘要 交通線檢測是一項基礎且具有挑戰性的任務。以往的…

一.android Studio開發系統應用——導入TvSettings源碼

目標 最終效果如上,實現在AS中編輯源碼后一鍵在真機中運行。達到和普通應用開發一樣的調試和編碼過程。這種方法可以大幅度提升開發速度,但是導入過程確實相對繁瑣和消耗時間。適合需要精細或者頻繁改動的系統app源碼。 一、新建項目 包名:com.android.tv.settings 版本:…

20250515讓飛凌的OK3588-C的核心板在Linux R4下適配以太網RTL8211F-CG為4線百兆時的接線圖

20250515讓飛凌的OK3588-C的核心板在Linux R4下適配以太網RTL8211F-CG為4線百兆時的接線圖 2025/5/15 20:19 緣起&#xff1a;以前做的網線找不到了&#xff0c;那就再來一條吧。 引腳定義要從頭來過&#xff1f;還好找到了一條。 開干&#xff01; 萬用表一對/點&#xff0c;幾…

【技術原理】Linux 文件時間屬性詳解:Access、Modify、Change 的區別與聯系

在 Linux 系統中&#xff0c;每個文件都有三個核心時間屬性&#xff1a;Access Time (atime)、Modify Time (mtime) 和 Change Time (ctime)。它們分別記錄文件不同維度的變更信息&#xff0c;以下是具體區別與聯系&#xff1a; 一、定義與觸發條件 時間屬性定義觸發條件示例A…

乘法口訣練習神器

請你利用python語言開發一個“乘法口訣練習神器”&#xff0c;主要輔助小學生練習乘法口訣&#xff0c;主要功能如下&#xff1a; 1. 能夠隨機循環出10道題&#xff0c;可以是乘法或者是除法。如果是乘法&#xff0c;確保兩個因數都是1-9之間的整數&#xff1b;如果是除法&…

[c語言日寄]數據結構:棧

【作者主頁】siy2333 【專欄介紹】?c語言日寄?&#xff1a;這是一個專注于C語言刷題的專欄&#xff0c;精選題目&#xff0c;搭配詳細題解、拓展算法。從基礎語法到復雜算法&#xff0c;題目涉及的知識點全面覆蓋&#xff0c;助力你系統提升。無論你是初學者&#xff0c;還是…

磁盤I/O瓶頸排查:面試通關“三部曲”心法

想象一下&#xff0c;你就是線上系統的“交通調度總指揮”&#xff0c;服務器的磁盤是所有數據進出的“核心樞紐港口”。當這個“港口”突然擁堵不堪&#xff0c;卡車&#xff08;數據請求&#xff09;排起長龍&#xff0c;進不去也出不來&#xff0c;整個系統的“物流”&#…

基于大模型預測胃穿孔預測與圍手術期管理系統技術方案

目錄 1. 系統架構模塊2. 關鍵算法實現2.1 術前預測模型(Transformer多模態融合)2.2 術中實時分析(在線學習LSTM)3. 模塊流程圖(Mermaid)3.1 數據預處理系統3.2 術前預測系統3.3 術中實時分析系統4. 技術驗證模塊4.1 模型可解釋性驗證4.2 邊緣計算部署架構1. 系統架構模塊…

C++:類和對象4

一&#xff0c;日期類實現 學習建議&#xff1a; 對于計算機學習來說&#xff0c;調試十分重要&#xff0c;所以在日常學習中一定要加大代碼練習&#xff0c;刷代碼題和課后自己敲出課上代碼例題&#xff0c;注意不要去對比正確代碼或者網上找正確代碼直接使用&#xff0c;一…

大數據架構選型分析

選擇依據 1.業務需求與技術要求 用戶需要根據自己的業務需求來選擇架構&#xff0c;如果業務對于Hadoop、Spark、Strom等關鍵技術有強制性依賴&#xff0c;選擇Lambda架構可能較為合適&#xff1b;如果處理數據偏好于流式計算&#xff0c;又依賴Flink計算引擎&#xff0c;那么…

Trae 插件 Builder 模式:從 0 到 1 開發天氣查詢小程序,解鎖 AI 編程新體驗

在軟件開發領域&#xff0c;效率與創新始終是開發者追求的核心目標。Trae 插件&#xff08;原 MarsCode 編程助手&#xff09;Builder 模式的全面上線&#xff0c;無疑為開發者帶來了全新的解決方案。它不僅同時支持 VS Code、JetBrains IDEs 等主流開發環境&#xff0c;還能讓…

SSM項目集成redis、Linux服務器安裝redis

在SSM&#xff08;Spring Spring MVC MyBatis&#xff09;項目中引入Redis主要分為以下步驟&#xff0c;確保配置正確并能在業務中靈活使用&#xff1a; 1. 添加Redis依賴?? 在Maven的pom.xml中添加Spring Data Redis和Jedis&#xff08;或Lettuce&#xff09;依賴&#…