Facase(外觀模式)
在Gof解釋:爲子系統定義統一接口,這個高級的接口會讓子系統更容易被調用。
以駕駛汽車爲例,當駕駛者開一輛汽車在路邊行駛時,汽車內部右許多的系統一起配合才能完成汽車的行走功能,這些系統可能包含:引擎系統,傳動系統,電裝系統…,但是,對於駕駛員來說,並不需要了解這些系統時如何協調工作的,他只需要通過高級接口(方向盤,踏板,儀表器)就可以讓汽車跑起來。所以,外觀模式的重點就是將系統內部的互動細節隱藏起來,並提供一個簡單的接口,之後客戶端通過這個接口,就可以操作複雜的系統並讓它們順利的運行。
Facase(外觀模式)的說明
- Client (客戶端,用戶)從原本需要操作多個子系統的情況,改爲只需要操作一個整合後的界面。
- SubSystem (子系統)原本由不同的客戶端來操作,改爲只會由內部系統之間交互使用。
- Facase(外觀模式 統一對外的界面),整合所有子系統的接口及功能,並提供高級界面或者接口供用戶使用。接收客戶端的信息後,將信息傳遞給負責的子系統。
Facase(外觀模式)框架設置
- 個子系統實現自己功能並提供接口
- PBaseDefenseGame: 包含了和系統相關的子系統對象,並提供了界面讓客戶端使用。
- 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接口類過於龐大且難以維護。