
外观模式:为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用。简单就是让客户端使用简单的界面来操控一个复杂的系统,减少客户端的要与之交互的系统数量,让客户端能够专心处理与本身有关的事情。
组成部分1.client(客户端,用户)从原本需要操控多个子系统改为面对一个整合后的界面。
2.subSystem(子系统)原本由不同的客户端即非同一个系统相关来操作,改为只会内部系统之间交互使用。
3.Facade(统一对外的界面)整合所有子系统的接口和功能,并提供接口供客户端使用。接受客户端的信息,将信息送给负责的子系统。
以植物大战僵尸为例,在战斗场景中,这个流程需要植物系统,僵尸系统,太阳系统等等,对于整个战斗系统而言,并不需要知道这些系统是如何交互,只需要调用接口就可以实现效果。
设计的脚本:
1.BaseDefenseGame 战斗统一对外的界面,包含与游戏相关的子系统,并提供接口让客户端使用
2.DefenseSystem,EnemySystem,SunSystem,MoneySystem 作为子系统管理各个功能模块。
3.BattleState 战斗状态类,是与BaseDefenseGame 互动的客户端之一。
在这里子系统就不一一展示,因为并不是文章的核心。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BaseDefenseGame
{
private DefenseSystem defenseSystem = null; //植物系统
private EnemySystem enemySystem = null; //僵尸系统
private SunSystem sunSystem = null; //太阳系统
private MoneySystem moneySystem = null; //金币系统
public void Init()
{
defenseSystem = new DefenseSystem();
enemySystem = new EnemySystem();
sunSystem = new SunSystem();
moneySystem = new MoneySystem();
}
public void Update()
{
defenseSystem.Update();
enemySystem.Update();
sunSystem.Update();
moneySystem.Update();
}
public void Release()
{
efenseSystem.Release();
enemySystem.Release();
sunSystem.Release();
moneySystem.Release();
}
//获取太阳的数量
public int GetSunNum()
{
if (sunSystem != null)
{
return sunSystem.GetSunNumber();
}
return 0;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BattleState : ISceneState
{
private SceneContext sceneContext;
public BattleState(SceneContext sceneContext):base(sceneContext)
{
this.sceneContext = sceneContext;
}
public override void SceneBegin()
{
BaseDefenseGame.Instance.Init();
}
public override void SceneEnd()
{
BaseDefenseGame.Instance.Release();
}
public override void SceneUpdate()
{
BaseDefenseGame.Instance.Update();
}
}
优缺点
在该设计中,使用外观模式让战斗状态类BattleState单一化,让该类只负责游戏在战斗状态下的功能执行和状态切换,不负责各个游戏系统的初始化和功能调用。具体优点:1.减少了不必要的类引用和功能整合,增加了BattleState类被重复使用的机会。同时减少系统之间的耦合度,有助于减少系统构建时间,以c/c++为例,当接口中的方法修改了,任何引用到该头文件.h的单元都必须重新编译。2.易于分工,对于一个庞大的系统,使用外观模式,对于其他人只需要了解对方提供系统的Facade接口类就行,不需要深入了解其中的运行结构。