news 2026/3/1 5:31:50

【设计模式】外观模式(Facade)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式】外观模式(Facade)详解

文章目录

    • 1. 引言:系统复杂,调用者太累
    • 2. 什么是外观模式
      • GoF 定义
    • 3. 外观模式的核心思想
    • 4. 外观模式的结构
    • 5. 示例:电脑启动系统
      • 5.1 子系统
      • 5.2 外观类
      • 5.3 客户端使用
    • 6. 外观模式的优点
    • 7. 外观模式的缺点
    • 8. 外观 vs 适配器 vs 桥接
    • 9. JDK 中的外观模式
      • Spring 的 JdbcTemplate
    • 10. 典型应用场景
      • 适合使用
      • 不适合使用
    • 11. 一个重要误区
    • 参考

1. 引言:系统复杂,调用者太累

在真实项目中,你经常会遇到这种代码:

CPUcpu=newCPU();Memorymemory=newMemory();Diskdisk=newDisk();cpu.start();memory.load();disk.read();

如果每个客户端都要写这一堆启动逻辑:

  • 调用顺序不能错
  • 依赖关系很复杂
  • 修改极易引发连锁问题

你会发现:

调用者被迫了解太多“系统内部细节”。

这正是外观模式要解决的问题。


2. 什么是外观模式

GoF 定义

为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。

详解:又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

外观(Facade)模式是“迪米特法则”的典型应用

一句话理解:

给复杂系统套一个“统一入口”。


3. 外观模式的核心思想

外观模式的目标不是添加功能,也不是改变接口,而是:

隔离“使用者”和“复杂实现”。

它的本质是:

  • 对外提供简单接口
  • 对内协调多个子系统

就像一个前台,你只要找它,不必认识公司所有员工。


4. 外观模式的结构

外观模式主要包含:

  1. Facade(外观类)

为多个子系统对外提供一个共同的接口。

  1. 多个子系统类

实现系统的部分功能,客户可以通过外观角色访问它。


5. 示例:电脑启动系统

5.1 子系统

publicclassCPU{publicvoidstart(){System.out.println("CPU启动");}}
publicclassMemory{publicvoidload(){System.out.println("内存加载");}}
publicclassDisk{publicvoidread(){System.out.println("磁盘读取");}}

5.2 外观类

publicclassComputerFacade{privateCPUcpu=newCPU();privateMemorymemory=newMemory();privateDiskdisk=newDisk();publicvoidstart(){cpu.start();memory.load();disk.read();System.out.println("电脑启动完成");}}

5.3 客户端使用

ComputerFacadecomputer=newComputerFacade();computer.start();

客户端再也不用关心 CPU、内存、磁盘的启动顺序。


6. 外观模式的优点

  1. 简化客户端调用
  2. 降低系统耦合度
  3. 提高系统可维护性
  4. 屏蔽内部复杂性

7. 外观模式的缺点

  1. 外观类可能变得臃肿
  2. 过度封装可能隐藏灵活性
  3. 不符合“对修改完全关闭”

8. 外观 vs 适配器 vs 桥接

模式目的
外观简化接口
适配器转换接口
桥接分离变化维度

9. JDK 中的外观模式

Spring 的 JdbcTemplate

jdbcTemplate.query(...)

内部封装了:

  • Connection
  • Statement
  • ResultSet
  • 异常处理

👉 对外提供“数据库访问外观”。


10. 典型应用场景

适合使用

  • 系统子模块复杂
  • 调用流程固定
  • 希望对外提供统一 API
  • 微服务、SDK 封装

不适合使用

  • 子系统很简单
  • 需要细粒度控制

11. 一个重要误区

外观模式不是为了“封死子系统”,而是为了“让大多数人用简单接口”。

高级用户仍然可以直接调用底层模块。


参考

外观模式 | 菜鸟教程

《图解设计模式》

外观 - Java教程 - 廖雪峰的官方网站

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 15:06:11

因果推断增强AI模型的域外泛化能力

因果推断增强AI模型的域外泛化能力 关键词:因果推断、AI模型、域外泛化能力、机器学习、因果图、结构因果模型 摘要:本文聚焦于因果推断如何增强AI模型的域外泛化能力。首先介绍了研究背景,明确目的、范围、预期读者等内容。接着阐述了因果推断和域外泛化的核心概念及其联系…

作者头像 李华
网站建设 2026/2/26 9:37:44

动态机器码

链接:https://pan.quark.cn/s/e84e768b1e70

作者头像 李华
网站建设 2026/2/15 12:47:11

AI编辑器

链接:https://pan.quark.cn/s/913f284a0b47、小红书emoji排版、小红书运营干货等功能和内容, 一站式搞定小红书笔记创作。

作者头像 李华
网站建设 2026/2/27 4:30:23

audio2face 脚本推送

版本:audio2face-2023.2.0audio2face 新增 audio player,选择stream audio player.import subprocess import os# 注意:请替换为你的Audio2Face实际安装路径 A2F_SCRIPTS_DIR r"D:\pro_2026\audio2face-2023.2.0\exts\omni.audio2face.…

作者头像 李华
网站建设 2026/2/26 15:29:52

深度学习毕设项目:基于python-CNN卷积神经网络识别玻璃是否破碎

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/16 1:34:54

Spring Boot 第一天:我与框架的“闪婚”之旅

嘿,大家好!我是星星,一个在编程世界里摸爬滚打的码农。今天,我要和你们分享我学习 Spring Boot 的第一天经历。这玩意儿听起来像个科幻小说里的超级英雄——“Spring Boot,拯救世界的脚手架!”但实际上&…

作者头像 李华