一、外观模式定义
外观模式(Facade)在GoF中的解释:为子系统定义一组统一的接口,这个高级接口会让子系统更容易被使用。 所以,外观模式的重点在于,它能够将系统内部的互动细节隐藏起来,并提供一个简单方便的接口。
二、外观模式说明
示意图表示:整合子系统并提供一个高级的界面让客户端使用。 其中的参与者具体说明:
- client(客户端、用户)
从原本需要操作多个子系统改为只需要面对一个整合后的界面。 - subSystem(子系统)
原本会由不同的客户端(非同一系统相关)来操作,改为只会由内部系统之间交互使用。 - Facade(统一对外的界面)
整合所有子系统的接口及功能,并提供高级界面(或接口)供客户端使用。 接受客户端的信息后,将信息传送给负责的子系统。
具体来说,外观模式可以让客户端使用简单的界面来操作一个复杂的系统,并且减少客户端要与之互动的系统数量,让客户端能够专心处理与本身有关的事情。
三、实现游戏主程序
1、游戏主架构设计
2、实现说明
- 子系统对外接口类 - PBaseDefenseGame
public class PBaseDefenseGame
{
private static PBaseDefenseGame _instance;
public static PBaseDefenseGame Instance
{
get
{
if (_instance == null)
_instance = new PBaseDefenseGame();
return _instance;
}
}
private bool m_bGameOver = false;
private GameEventSystem m_GameEventSystem;
private CampSystem m_CampSystem;
private StageSystem m_StageSystem;
public void Initinal()
{
m_bGameOver = false;
m_GameEventSystem = new GameEventSystem(this);
m_CampSystem = new CampSystem(this);
m_StageSystem = new StageSystem(this);
}
public void Release()
{
m_GameEventSystem.Release();
m_CampSystem.Release();
m_StageSystem.Release();
m_CharacterSystem.Release();
}
public void Update()
{
m_GameEventSystem.Update();
m_CampSystem.Update();
m_StageSystem.Update();
}
public bool ThisGameIsOver()
{
return m_bGameOver;
}
}
public class BattleState : ISceneState
{
public BattleState(SceneStateController Controller) : base(Controller)
{
this.StateName = "BattleState";
}
public override void StateBegin()
{
PBaseDefenseGame.Instance.Initinal();
}
public override void StateEnd()
{
PBaseDefenseGame.Instance.Release();
}
public override void StateUpdate()
{
PBaseDefenseGame.Instance.Update();
}
}
3、使用外观模式的优点
- 上述示例中可体现:
1、将战斗状态类BattleState单一化,让该类只负责游戏在“战斗状态”下的功能执行及状态切换,不用负责串接各个游戏系统的初始化和功能调用。 2、使战斗状态类BattleState减少了不必要的类引用即功能整合,因此增加了BattleState类被重复使用的机会。
- 如果外观模式运用得当还具有以下优点:
- 节省时间
比如:Unity组件接口(物理、渲染,UI,粒子等)是使用Facade接口,通过面板公开参数,可通过调整相关参数数据可以轻易得到反馈效果。 - 易于分工开发
比如,在工作分工配合上,开发者只需要了解对方负责系统的Facade接口,不必深入了解其中运作方式。 - 增加系统的安全性
这里安全性是指系统执行时“意外宕机或者出错”的情况。比如,一个功能先通知A去做后通知B做,一旦顺序出错会让系统初始化失败或导致宕机,所以需要Facade接口类来完成,不应该有客户端去做。
四、结论
将复杂的子系统沟通交给单一的一个类负责,并提供单一界面给客户端使用,使客户减少对系统的耦合度使外观模式(Facade)的优点。
|