1. 程式人生 > >外觀模式+遊戲開發中的設計模式——外觀模式

外觀模式+遊戲開發中的設計模式——外觀模式

何為外觀模式

外觀模式(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
    }
}