Unity外观模式

在实际开发中,我们经常会遇到这样的问题:
一个简单的功能,背后却依赖了多个系统的协同工作

如果这些调用逻辑直接暴露给外部使用者,不仅使用成本高,而且一旦内部实现发生变化,外部代码也需要频繁修改。

外观模式(Facade Pattern) 正是为了解决这个问题而存在的。

它通过提供一个统一、简洁的入口,将复杂的子系统调用隐藏在内部,让使用者只需要关心"做什么",而不需要关心"怎么做"。

比如你去食堂吃饭,你只需要点餐即可,那些切菜炒菜的逻辑其实你并不关心。

1.操作模块

假设我们要实现一个视频播放功能,看似只是"播放视频",但内部实际上涉及多个子系统:视频解码,音频播放,字幕加载。

cs 复制代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Decoder
{
    public void Decode() =>  Debug.Log("解码视频");
}

public class AudioSystem
{
    public void PlayAudio() => Debug.Log("播放音频");
}

public class SubtitleSystem
{
    public void LoadSubtitle() => Debug.Log("加载字幕");
}

这些类各自职责单一、功能明确,但如果由外部直接调用,使用成本会非常高

2.封装操作逻辑

为了解耦外部调用与内部实现,我们引入一个外观类 VideoPlayerFacade

它负责组合并协调多个子系统的调用顺序

cs 复制代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class VideoPlayerFacade
{
    private Decoder decoder = new Decoder();
    private AudioSystem audio = new AudioSystem();
    private SubtitleSystem subtitle = new SubtitleSystem();

    public void Play()
    {
        decoder.Decode();
        audio.PlayAudio();
        subtitle.LoadSubtitle();
        Debug.Log("视频播放中...");
    }
}

此时,外部只需要面对一个高层接口,而不需要了解任何内部细节。

3.调用逻辑

直接调用Play()方法不用关心细节,后续如果如要添加新的逻辑也不用改玩家的代码。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    void Start()
    {
        VideoPlayerFacade myvideo = new VideoPlayerFacade();
        myvideo.Play();
    }
}

可以看到,客户端代码非常简洁:

  • 只调用一个 Play() 方法

  • 完全不依赖解码、音频、字幕等具体实现

即使以后增加新的播放逻辑,也无需修改玩家代码。

4.运行结果

将玩家脚本加到场景中的一个空对象上,运行游戏,可以看到我们明明只调用了一个方法,但是其他操作也被打印了出来。

5、外观模式 vs 中介者模式(重点区别)

1️⃣ 外观模式(Facade)

  • 目的:简化使用

  • 关注点:对外提供统一入口

  • 特点

    • 子系统之间并不知道外观的存在

    • 外观只是"包装调用流程"

  • 典型场景

    • 播放器

    • UI 系统初始化

    • 各类 Manager 的统一入口

👉 外观模式是 "对外封装复杂性"


2️⃣ 中介者模式(Mediator)

  • 目的:解耦对象之间的通信

  • 关注点:对象之间如何交互

  • 特点

    • 各个对象只和中介者通信

    • 中介者掌握全局交互逻辑

  • 典型场景

    • UI 面板之间的联动

    • 技能、BUFF、状态之间的相互影响

    • 复杂对象关系管理

👉 中介者模式是 "对内协调关系"

再说得简单一点外观模式就相当于你去一个餐馆吃放,你点餐过后餐馆里面的厨师,服务员,收银员他们都为你提供服务,你并不需要知道他们是怎么干活的。中介者模式相当于服务员,他负责和其他员工通信,不需要你一个一个去联系他们。

6.总结

外观模式通过提供一个高层接口,将多个子系统的复杂调用封装在内部,让客户端只需要关心功能本身而非实现细节。

在 Unity 和游戏开发中,它非常适合用于播放器、系统初始化、功能模块入口等场景,能够有效降低耦合度,提高代码的可读性与维护性。

相关推荐
叶帆9 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君9 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子10 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai31524754310 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
心前阳光10 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光10 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯10 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案10 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔10 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
鼎艺创新科技10 天前
三维电子沙盘中OSGB倾斜摄影数据的加载与渲染
游戏引擎·cocos2d