外觀模式是一種結構型設計模式,為復雜子系統提供??統一的高層接口??,通過定義一個外觀類來??簡化客戶端與子系統的交互??,降低系統耦合度。這種模式隱藏了子系統的復雜性,將客戶端與子系統的實現細節隔離開來,讓客戶端只需與外觀類交互即可完成復雜的操作。
優點:
1.簡化接口:客戶端只需與外觀類交互,無需了解子系統的復雜接口和實現細節,降低了客戶端的使用難度。
2.降低耦合度:將客戶端與子系統隔離開來,使得子系統的變化不會影響到客戶端,提高了系統的可維護性和可擴展性。
3.提高靈活性:可以根據需要添加或修改外觀類的方法,而不會影響到子系統的實現。
缺點:
1.不符合開閉原則:如果需要添加新的子系統功能,可能需要修改外觀類的代碼,這違反了開閉原則。
優化:提供擴展方法或鉤子方法。
2.外觀類可能過于龐大:當子系統的功能越來越多,外觀類的方法也會越來越多,導致外觀類變得龐大和復雜。
優化:分拆為多個子外觀類。
// 基礎層
class CoreFacade {protected DatabaseService _db = new DatabaseService();protected CacheService _cache = new CacheService();
}// 擴展層(繼承復用)
class BusinessFacade : CoreFacade {private AnalyticsService _analytics = new AnalyticsService();public void ProcessOrder(Order order) {_cache.Store(order);_db.Save(order);_analytics.Track(order);}
}
說明例子:
1.UML類圖:
2.實現:
1.定義一個外觀類:
public class AppFacadePattern{private GameEventSys m_gameEventSys = null;private CampSys m_campSys = null; public void Initinal(){m_gameEventSys = new GameEventSys();m_campSys = new CampSys();}public void Update(){m_gameEventSys.Update();m_campSys.Update();}}
2.定義一個基礎系統類以及兩個實際系統類:
public class BaseSys{public virtual void Update(){}}public class GameEventSys : BaseSys{public override void Update(){Debug.Log("GameEventSys Update");}}public class CampSys : BaseSys{public override void Update(){Debug.Log("CampSys Update");}}
3.測試類:
public class AppFacade : MonoBehaviour
{AppFacadePattern appFacade = null;void Start(){appFacade = new AppFacadePattern();appFacade.Initinal();}void Update(){appFacade?.Update(); }
}
游戲中的使用場景:
1.游戲資源加載與管理:游戲里需要加載各種各樣的資源(像圖片、音頻、模型等),可能涉及不同的加載器、緩存機制等。
2.游戲輸入管理:游戲中的輸入方式多種多樣,比如鍵盤、鼠標、手柄等,不同的輸入設備有不同的處理邏輯,而且還可能存在不同的輸入模式(如菜單模式、游戲模式等)。
3.游戲特效管理:游戲中常常會有各種特效,如粒子特效、光影特效、音效特效等。每種特效都有其獨特的創建、播放和銷毀邏輯。
4.游戲網絡通信管理:游戲中的網絡通信涉及多個方面,例如連接服務器、發送和接收數據、處理網絡錯誤等。這些操作可能較為復雜,并且不同的網絡協議和服務器有不同的實現方式。
5.新手引導系統:?引導流程需要控制UI提示、鏡頭移動、操作鎖定等多個模塊。
6.存檔/讀檔系統?:玩家數據保存涉及角色狀態、任務進度、地圖探索等多個子系統。
7.場景加載管理器?:場景加載涉及資源加載、光照烘焙、物理系統初始化等多個子系統。
8.戰斗系統封裝?:角色攻擊需要協調動畫、傷害計算、特效、音效等多個模塊???????。
9.動態難度調整?:難度平衡涉及敵人屬性、掉落率、AI行為等多個參數。
總結:
通過合理應用外觀模式,可以顯著提升 C# 項目的可維護性和架構清晰度,特別是在處理復雜系統集成、第三方庫封裝或跨團隊協作場景中效果顯著。
參考書籍:
《Hands-On Game Development Patterns with Unity 2019》
《設計模式與游戲完美開發》