当前位置: 首页 > java >正文

外观模式(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)

Computer
-CPU cpu
-Memory memory
-HardDrive hard_drive
+start()
CPU
+freeze()
+execute()
Memory
+load(position, data)
HardDrive
+read(sector)

🧭 调用流程图(Mermaid)

Client Computer CPU Memory HardDrive start() freeze() read(0) boot_data load(0, boot_data) execute() Client Computer CPU Memory HardDrive

🧠 应用场景总结

场景应用
子系统复杂,外部统一入口启动系统、网络API、银行账户操作
多模块聚合操作多步骤的注册/下单流程
封装第三方库Flask / TensorFlow 二次封装统一接口

✅ 总结口诀

“外面只看一扇门,门后全是子系统”。
✅ 外观模式:用一个统一入口屏蔽多个子模块,让使用者不被内部复杂性干扰


如果你希望我换成你熟悉的场景(比如 Flask 接口封装,AI 模型统一推理接口等)做一个 Facade 示例,也可以立刻提供!是否继续深入?

http://www.xdnf.cn/news/3771.html

相关文章:

  • MIT 6.S081 2020 Lab2 system calls 个人全流程
  • 【ThinkBook 16+ 电脑重做系统type-c接口部分功能失效解决方案】
  • 从github的插件直接导入unity
  • Android之Button、ImageButton、ChipGroup用法
  • iview 分页改变每页条数时请求两次问题
  • GoLang基础(续)
  • 多模态大语言模型arxiv论文略读(五十八)
  • spdlog自定义formatter
  • edu教育邮箱申请成功使用
  • 前端双工通信的几种方案详细描述
  • SpringMVC——第四章:三个域对象
  • WPF中Binding
  • 【SimSession】1:将视频发送逻辑与 libuv 事件循环集成是一个典型的并发设计问题
  • 【论文阅读】LLMOPT:一种提升优化泛化能力的统一学习框架
  • 【leetcode】队列 + 宽搜,树形结构层序遍历的基础与变化
  • 短信侠 - 自建手机短信转发到电脑上并无感识别复制验证码,和找手机输验证码说再见!
  • 第四节:OpenCV 基础入门-第一个 OpenCV 程序:图像读取与显示
  • 五四青年节|模糊的青春岁月,用视频高清修复工具,让回忆更清晰!
  • 如何提升个人的思维能力?
  • 学习黑客环境配置
  • c++ 指针参数传递的深层原理
  • [Vue]props解耦传参
  • 我写了一个分析 Linux 平台打开文件描述符跨进程传递的工具
  • 动态规划之多状态问题1
  • AIStarter开发者手记:一键部署本地大模型,跨平台整合包技术解析
  • 63常用控件_QSlider的使用
  • STL之list容器
  • 计算机基础:二进制基础17,八进制减法
  • 大模型中常见的精度类型及区别​
  • 论微服务架构及其应用