Skip to content

外观模式

为复杂子系统提供一个统一的接口,使得子系统更易使用。

适合的场景

系统太复杂,不想让外部访问者看到内部的混乱结构 想为调用方提供一个简单清爽的接口

让系统更易于使用、解耦、维护

用来构建「高级API」,比如一行代码就能启动一个大项目

基本结构

  1. Facade(外观类):提供统一的接口,屏蔽内部复杂逻辑

  2. Subsystem(子系统类):实现真正的业务,外部不直接接触

示例

csharp
// 子系统1:图形系统
class Graphics
{
    public void Init() => Console.WriteLine("初始化图形系统");
}

// 子系统2:音频系统
class Audio
{
    public void Init() => Console.WriteLine("初始化音频系统");
}

// 子系统3:输入系统
class Input
{
    public void Init() => Console.WriteLine("初始化输入系统");
}

// 外观类:游戏引擎
class GameEngine
{
    private readonly Graphics graphics = new();
    private readonly Audio audio = new();
    private readonly Input input = new();

    public void Start()
    {
        Console.WriteLine("正在启动游戏引擎...");
        graphics.Init();
        audio.Init();
        input.Init();
        Console.WriteLine("游戏准备就绪!");
    }
}

// 使用
var engine = new GameEngine();
engine.Start();

GDScript 示例

gdscript
# 子系统1
class SaveSystem:

    func load_data():
        print("正在加载存档...")

# 子系统2
class UIModule:

    func init_ui():
        print("初始化 UI 界面...")

# 子系统3
class AudioManager:

    func play_bgm():
        print("播放背景音乐...")

# 外观类
class GameLauncher:

    var save := SaveSystem.new()
    var ui := UIModule.new()
    var audio := AudioManager.new()

    func start_game():
        print("游戏正在启动...")
        save.load_data()
        ui.init_ui()
        audio.play_bgm()
        print("启动完成!")
        
# 使用
func _ready():
    var launcher = GameLauncher.new()
    launcher.start_game()