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接口类过于庞大且难以维护。