外观模式(Facade Pattern)
非常好!现在我们来讲解结构型设计模式之一:外观模式(Facade Pattern)。
我会通过:
✅ 简洁定义 + 🎯 为什么需要 + 🐍 Python 代码(含注释)+ 🧭 流程图 + 应用场景
帮助你快速掌握它的使用方式。
🧠 一句话定义
外观模式通过定义一个统一的高层接口,来简化对一组复杂子系统的调用。
🎯 为什么需要外观模式?
问题 | 外观模式的解决方案 |
---|---|
系统内部模块太多,调用复杂 | 提供统一入口 |
客户端不应知道细节太多 | 屏蔽内部子系统复杂性 |
提高模块解耦 | 客户端依赖 Facade,而不是每个子类 |
✅ 优点 vs ❌ 缺点
✅ 优点 | ❌ 缺点 |
---|---|
简化使用(统一封装) | 不易扩展内部子系统功能 |
降低耦合(只对 Facade 编程) | Facade 一旦设计不合理会限制系统能力 |
符合迪米特法则 | - |
🧩 举例场景:电脑启动系统
启动电脑其实是多个子模块协作(电源、CPU、硬盘、操作系统等)
你不希望用户知道怎么操作每个模块,只需要调用 Computer.start()
即可。
🐍 Python 示例:电脑开机
🔧 1️⃣ 子系统类(多个内部模块)
class CPU:def freeze(self):print("❄️ CPU 正在冻结等待...")def execute(self):print("⚙️ CPU 执行指令...")class Memory:def load(self, position, data):print(f"🧠 内存加载数据[{data}] 到位置 {position}")class HardDrive:def read(self, sector):print(f"💽 硬盘读取扇区 {sector}")return f"数据@{sector}"
🧰 2️⃣ 外观类:统一封装复杂过程
class Computer:def __init__(self):self.cpu = CPU()self.memory = Memory()self.hard_drive = HardDrive()def start(self):print("🟢 开始开机...")self.cpu.freeze()boot_data = self.hard_drive.read(0)self.memory.load(0, boot_data)self.cpu.execute()print("✅ 系统启动成功!")
🧪 3️⃣ 客户端只关心 Facade 接口
if __name__ == "__main__":computer = Computer()computer.start()
✅ 输出结果:
🟢 开始开机...
❄️ CPU 正在冻结等待...
💽 硬盘读取扇区 0
🧠 内存加载数据[数据@0] 到位置 0
⚙️ CPU 执行指令...
✅ 系统启动成功!
🧭 清晰完整的类图(Mermaid)
🧭 调用流程图(Mermaid)
🧠 应用场景总结
场景 | 应用 |
---|---|
子系统复杂,外部统一入口 | 启动系统、网络API、银行账户操作 |
多模块聚合操作 | 多步骤的注册/下单流程 |
封装第三方库 | Flask / TensorFlow 二次封装统一接口 |
✅ 总结口诀
“外面只看一扇门,门后全是子系统”。
✅ 外观模式:用一个统一入口,屏蔽多个子模块,让使用者不被内部复杂性干扰。
如果你希望我换成你熟悉的场景(比如 Flask 接口封装,AI 模型统一推理接口等)做一个 Facade 示例,也可以立刻提供!是否继续深入?