外觀模式+遊戲開發中的設計模式——外觀模式
阿新 • • 發佈:2019-01-14
何為外觀模式
外觀模式(Facade):為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使子系統更加容易使用
依賴倒轉原則+迪米特法則思想
程式碼實現
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 外觀模式 { class Program { static void Main(string[] args) { Facade facade=new Facade(); //由於Facade的作用,客戶端可以根本不知子系統類的存在 facade.MethodOne(); facade.MethodTwo(); Console.ReadKey(); } } //外觀類 class Facade { //外觀類,他需要了解所有的子系統的方法或屬性,進行組合,以備往外界呼叫 A a; B b; C c; D d; public Facade() { a=new A(); b=new B(); c=new C(); d=new D(); } public void MethodOne() { a.MethodA(); d.MethodD(); } public void MethodTwo() { b.MethodB(); c.MethodC(); d.MethodD(); } } //子系統類 class A { public void MethodA() { Console.WriteLine("A類"); } } class B { public void MethodB() { Console.WriteLine("B類"); } } class C { public void MethodC() { Console.WriteLine("C類"); } } class D { public void MethodD() { Console.WriteLine("D類"); } } }
應用場合
分三個階段
首先,在設計初期階段,應該有意識的將不同的兩個層分離,層與層之間建立外觀Facade,可以為複雜的子系統提供一個簡單的介面,使耦合大大降低
其次,在開發階段,子系統往往因為不斷的重構演化而變得原來越複雜,,,大多數的模式使用時,也都會產生很多很小的類,也給外部呼叫帶來了困難,,,增加外觀模式Facade可以提供一個簡單的介面,減少他們之間的依賴
第三,在維護一個遺留的大型系統時,可能這個系統已經非常難以維護和擴充套件,,為新系統開發一個外觀Facade類,來提供設計粗糙或高複雜的遺留程式碼的比較清晰的簡單的介面,讓新系統與Facade物件互動,Facade與遺留程式碼互動所有複雜的工作。
案例:
建立Facade類
using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; public class GameFacade { //建立遊戲子系統管理的總類Facade(外觀模式) //輔助狀態管理,新增遊戲是否結束,判斷何時切換場景 private bool mIsGameOver = false; public bool isGameOver { get { return mIsGameOver; } } public void Init () //即MethodOne { //具體的A\B\C\D等子類 } public void Update()//即MethodTwo { //具體的A\B\C\D等子類 } public void Release() //即MethodThree { //具體的A\B\C\D等子類 } }
使用Facade類
using System;
using System.Collections.Generic;
using System.Text;
public class AttackState:ISceneState
{
public AttackState(SceneStateControl controller): base("03AttackScene", controller)
{
}
private GameFacade mFacade;
//建立一個類,管理
//兵營、關卡、角色管理、行動力、成就等子系統系統
//由於Facade類的作用,AttackState可以不用知道具體子類的存在
//使用Facade外觀模式,使AttackState很簡潔,只處理與自身狀態有關的
public override void StateStart()
{
mFacade.Init();//使用FacademethodOne
}
public override void StateEnd()
{
mFacade.Release();//使用FacademethodTwo
}
public override void StateUpdate()
{
if(mFacade.isGameOver){
mControler.SetState(new MainState(mControler));
}
mFacade.Update();//使用FacademethodThree
}
}