java23种设计模式-外观模式

embedded/2025/2/26 21:04:27/

外观模式(Facade Pattern)学习笔记

🌟 定义

外观模式属于结构型设计模式,提供一个统一的接口来访问子系统中的多个接口。它通过定义一个高层接口简化客户端与复杂子系统的交互。


🎯 适用场景

  1. 为复杂子系统提供简单入口
  2. 解耦客户端与子系统
  3. 分层构建系统(各层通过外观类交互)
  4. 遗留系统重构(用外观类封装旧接口)

🔧 模式结构

📐 类图

Client
Facade
-subsystemA: SubsystemA
-subsystemB: SubsystemB
-subsystemC: SubsystemC
+operation()
SubsystemA
+operationA()
SubsystemB
+operationB()
SubsystemC
+operationC()

🛠️ 核心组成

  1. Facade(外观角色)

    • 知道子系统功能
    • 将客户端请求委派给对应子系统对象
  2. Subsystem Classes(子系统角色)

    • 实现子系统具体功能
    • 不感知外观存在(可独立运行)

📝 代码示例

家庭影院场景

// 子系统类
class Lights {void dim() { System.out.println("灯光调暗"); }
}class SoundSystem {void on() { System.out.println("音响开启"); }
}class Projector {void down() { System.out.println("幕布降下"); }
}// 外观类
class HomeTheaterFacade {private Lights lights;private SoundSystem sound;private Projector projector;public HomeTheaterFacade() {this.lights = new Lights();this.sound = new SoundSystem();this.projector = new Projector();}public void watchMovie() {lights.dim();sound.on();projector.down();}
}// 客户端
public class Client {public static void main(String[] args) {HomeTheaterFacade facade = new HomeTheaterFacade();facade.watchMovie(); // 一键启动观影模式}
}

✅ 优点

  • 简化客户端使用复杂度
  • 客户端与子系统松耦合
  • 更好的访问控制(可限制直接访问子系统)
  • 符合迪米特法则(最少知识原则)

⚠️ 缺点

  • 过度使用会导致系统层级过多
  • 增加维护成本(修改子系统可能需调整外观)
  • 可能成为"上帝对象"(需注意职责划分)

🔄 相关模式对比

模式区别
中介者模式关注子系统间的通信协调
单例模式外观类常实现为单例
抽象工厂模式可与外观结合封装创建过程

💡 实践建议

  1. 优先考虑子系统重构而不是外观包装
  2. 保持外观类的单一职责
  3. 可创建多个外观类对应不同使用场景
  4. 通过依赖注入管理子系统对象

掌握外观模式的关键在于理解它作为系统门户的定位,合理使用可以显著提升系统的易用性和可维护性。


http://www.ppmy.cn/embedded/167359.html

相关文章

接雨水的算法

题目 代码 # 接雨水算法 def trap(height):# 1. 特殊情况:数组为空 则返回0if not height:return 0n len(height)# 2. 初始化左右指针,左右最大值,结果left, right 0, n - 1# maxleft代表左边最大值,maxright代表右边最大值max…

图片爬取案例

修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…

css 实现 tailwindcss peer 功能

1.假设我们有两个相邻的元素&#xff0c;当第一个元素处于 focus 状态时&#xff0c;我们要改变第二个元素的样式。 ①.运用 :focus 伪类和相邻兄弟选择器 &#xff0c;当 input 元素处于 focus 状态时&#xff0c;改变 div 元素的背景颜色和文字颜色。 <!DOCTYPE html>…

[Web 安全] PHP 反序列化漏洞 —— PHP 面向对象基础知识

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 因为后面介绍的 PHP 反序列化漏洞其实与 PHP 对象是密不可分的&#xff0c;所以这边笔者就简单介绍一下 PHP 中面向对象编程的基础知识。这里笔者是假定读者已经对 PHP 有基础了解了&#…

【gitlab】认识 持续集成与部署

持续集成&#xff08;CI&#xff09;与持续部署&#xff08;CD&#xff09; 1. 什么是持续集成&#xff08;CI&#xff09;&#xff1f; 持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;是一种软件开发实践&#xff0c;强调开发人员频繁地将代码提交到…

Linux的目录结构

linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。Linux中有许多规定好的目录名字&#xff0c;不允许修改。 在Linux世界里&#xff0c;一切皆文件。把硬件当做文件来管理。 具体目录结构…

Java 数学函数库

文章目录 前言为什么用 Java 编写代码量项目结构核心模块 math-library常规整数有理数有限小数进制数复数集合离散函数统计 自研算法大有理数转化为 double 自创概念数排编码组合编码二进制编码 概率组合选概率 压缩均匀压缩 核心模块 math-built-in-type基础计算统计排列组合操…

sage-huga改进SITAN

Sage-Husa自适应滤波算法 Sage-Husa自适应滤波算法是一种在递推滤波过程中实时估计和修正系统噪声和观测噪声统计特性的算法,从而降低系统模型误差,提高滤波精度。该算法基于卡尔曼滤波,并通过自适应调整噪声协方差矩阵来优化滤波效果。 算法原理 Sage-Husa滤波器的核心思…