为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用
举个栗子
当驾驶者开一辆汽车在路上行驶,汽车内部有许多子系统,比如引擎系统、传动系统、悬吊系统等等,但对驾驶者(客户端)而言,并不需要了解这些子系统是如何协调工作的,只需要通过高级接口(方向盘、踏板、仪表盘)就可以轻易操控汽车
外观模式的重点在于,它能将系统内部的互动细节隐藏起来,并提供一个更简单方便的接口。之后客户端只需要通过这个接口,就可以操作一个复杂系统并让他们顺利运行。
外观模式的优点
将复杂的子系统沟通交给单一的一个类负责,并提供单一界面给客户端使用,减少系统的耦合度是外观模式的优点。
外观模式的缺点
由于将所有子系统集中在外观模式接口类中,最终会导致外观模式接口类过于庞大且难以维护。
当发生这种情况时,重构外观模式接口类,将功能相近的子系统进行整合,减少内部系统的依懒性。
下边是例子
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Leon_Facade_Main
{
///
/// Singleton模板
///
private static Leon_Facade_Main _instance;
public static Leon_Facade_Main Instance
{
get
{
if (_instance == null)
_instance = new Leon_Facade_Main();
return _instance;
}
}
///
/// 场景状态控制
///
private bool m_bGameOver = false;
//游戏系统
private Leon_GameEventSystem m_GameEventSystem = null; //游戏事件系统
private Leon_AchievementSystem m_AchievementSystem = null;//成就系统
//在这写入其他...
//界面
//在这写入其他...
//声明私有,无法被外部调用
private Leon_Facade_Main() { }
///
/// 初始Leon_Facade_Main游戏相关设定
///
public void Initial()
{
//场景控制状态
m_bGameOver = false;
//游戏状态
m_GameEventSystem = new Leon_GameEventSystem(this);//游戏事件系统
m_AchievementSystem = new Leon_AchievementSystem(this);//成就系统
//在这写入其他...
//界面
//在这写入其他...
//注入其他系统
//...
//载入存档
LoadData();
//注册游戏事件系统
RegisterGameEvent();
}
///
/// 释放游戏系统
///
public void Release()
{
//游戏系统
m_GameEventSystem.Release(); //游戏事件系统释放
m_AchievementSystem.Release();//成就系统释放
//在这写入其他...
//界面
//在这写入其他...
//存档
SaveData();
}
///
/// 更新
///
public void Update()
{
//玩家输入
InputProcess();
//游戏系统更新
m_GameEventSystem.Update();//游戏事件系统更新
m_AchievementSystem.Update();//成就系统更新
//在这写入其他...
//玩家界面更新
//在这写入其他...
}
//玩家输入
private void InputProcess()
{
//Mouse 左键
if (Input.GetMouseButtonUp(0) == false)
return;
//由摄像机产生一条射线
//Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//RaycastHit[] hits = Physics.RaycastAll(ray);
}
///
/// 注册游戏事件系统
///
private void RegisterGameEvent()
{
//事件注册
m_GameEventSystem.RegisterObserver(ENUM_GameEvent.EnemyKilled, new Leon_EnemyKilledObserverUI(this));
//在这写入其他...
}
//注册游戏事件
public void RegisterGameEvent(ENUM_GameEvent emGameEvent, Leon_IGameEventObserver Observer)
{
m_GameEventSystem.RegisterObserver(emGameEvent, Observer);
}
//通知游戏事件
public void NotifyGameEvent(ENUM_GameEvent emGameEvent, System.Object Param)
{
m_GameEventSystem.NotifySubject(emGameEvent, Param);
}
///
/// 游戏状态
///
/// 场景状态控制
public bool ThisGameIsOver()
{
return m_bGameOver;
}
//换回主菜单
public void ChangToMainMenu()
{
m_bGameOver = true;
}
///
/// 存档
///
private void SaveData()
{
Leon_AchievementSaveData SaveData = m_AchievementSystem.CreateSaveData(); ;
SaveData.SaveData();
}
//取回存档
private Leon_AchievementSaveData LoadData()
{
Leon_AchievementSaveData OldData = new Leon_AchievementSaveData();
OldData.LoadData();
m_AchievementSystem.SetSaveData(OldData);
return OldData;
}
}