游戏设计模式——外观模式(Facade)

外观模式

为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用
举个栗子
当驾驶者开一辆汽车在路上行驶,汽车内部有许多子系统,比如引擎系统、传动系统、悬吊系统等等,但对驾驶者(客户端)而言,并不需要了解这些子系统是如何协调工作的,只需要通过高级接口(方向盘、踏板、仪表盘)就可以轻易操控汽车

外观模式的重点在于,它能将系统内部的互动细节隐藏起来,并提供一个更简单方便的接口。之后客户端只需要通过这个接口,就可以操作一个复杂系统并让他们顺利运行。

外观模式的优点
将复杂的子系统沟通交给单一的一个类负责,并提供单一界面给客户端使用,减少系统的耦合度是外观模式的优点。

外观模式的缺点
由于将所有子系统集中在外观模式接口类中,最终会导致外观模式接口类过于庞大且难以维护。
当发生这种情况时,重构外观模式接口类,将功能相近的子系统进行整合,减少内部系统的依懒性。

下边是例子

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;
    }

}

你可能感兴趣的:(游戏设计模式,设计模式,游戏,unity)