設計模式之外觀模式

Facase(外觀模式)

在Gof解釋:爲子系統定義統一接口,這個高級的接口會讓子系統更容易被調用。
以駕駛汽車爲例,當駕駛者開一輛汽車在路邊行駛時,汽車內部右許多的系統一起配合才能完成汽車的行走功能,這些系統可能包含:引擎系統,傳動系統,電裝系統…,但是,對於駕駛員來說,並不需要了解這些系統時如何協調工作的,他只需要通過高級接口(方向盤,踏板,儀表器)就可以讓汽車跑起來。所以,外觀模式的重點就是將系統內部的互動細節隱藏起來,並提供一個簡單的接口,之後客戶端通過這個接口,就可以操作複雜的系統並讓它們順利的運行。

Facase(外觀模式)的說明

在這裏插入圖片描述

  1. Client (客戶端,用戶)從原本需要操作多個子系統的情況,改爲只需要操作一個整合後的界面。
  2. SubSystem (子系統)原本由不同的客戶端來操作,改爲只會由內部系統之間交互使用。
  3. Facase(外觀模式 統一對外的界面),整合所有子系統的接口及功能,並提供高級界面或者接口供用戶使用。接收客戶端的信息後,將信息傳遞給負責的子系統。

Facase(外觀模式)框架設置

在這裏插入圖片描述

  1. 個子系統實現自己功能並提供接口
  2. PBaseDefenseGame: 包含了和系統相關的子系統對象,並提供了界面讓客戶端使用。
  3. BattleState: 客戶端

實現說明

在PBaseDefenseGame類中,將所有的子系統定義爲類的成員。

   public class PBaseDefenseGame
    {
        ...
        //遊戲系統
        private GameEeventSysem m_GameEeventSysem = null;           //遊戲事件系統
        private GameSystem m_GameSystem = null;                     //兵營
        private StageSystem m_StageSystem = null;                   //關卡系統
        private CharacterSystem m_CharacterSystem = null;           //角色管理系統
        ...
    }

提供初始化方法,供遊戲開始調用,初始化方法被調用時,各個子系統的對象纔會被生產出來。

 public void Initinal()
    {
        //遊戲系統
        m_GameEeventSysemv = new GameEeventSysem(this);
        m_GameSystem = new GameSystem(this);
        m_StageSystem = new StageSystem(this);
        m_CharacterSystem = new CharacterSystem(this);
        ...
    }

在定義出相關的高級界面供客戶端使用,而這些方法,多數會把收到的信息或者請求轉發給相應的子系統負責。

  public void Update()
    {
        m_GameEeventSysemv.Updata();
        m_GameSystem.Updata();
        m_StageSystem.Updata();
        m_CharacterSystem.Updata();
        ...
    }

    public bool ThisGameIsOver()
    {
        return m_bGameOver;
    }

    public int GetEnemyCount()
    {
        ...
    }

在客戶端中(BattelState)中,通過PBaseDefenseGame類提供的接口來操作系統的運行,

public class BattleState : IScenState
    {
        ....
        publie override void StateBeging()
        {
            ...
            PBaseDefenseGame.Instance,Initnal();
        }

        publie override void StateEnd()
        {
            ...
            PBaseDefenseGame.Instance,Release();
        }

        publie override void StateUpdate()
        {
            ...
            PBaseDefenseGame.Instance,Updata();
        }
    }

外觀模式缺點

由於將所有的子系統集中在Facade接口中,最終會導致Facade接口類過於龐大且難以維護。

發佈了37 篇原創文章 · 獲贊 11 · 訪問量 9152
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章