外观模式
为复杂子系统提供一个统一的接口,使得子系统更易使用。
适合的场景
系统太复杂,不想让外部访问者看到内部的混乱结构 想为调用方提供一个简单清爽的接口
让系统更易于使用、解耦、维护
用来构建「高级API」,比如一行代码就能启动一个大项目
基本结构
Facade(外观类):提供统一的接口,屏蔽内部复杂逻辑
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()