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

结构性设计模式之Facade(外观)设计模式

结构性设计模式之Facade(外观)设计模式

前言:
外观模式:用自己的话理解就是用户看到是一个总体页面,比如xx报名系统页面。里面有历年真题模块、报名模块、教程模块、首页模块… 做了一个各个模块的合并,对用户操作起来比较简单,用户不必知道里面有什么系统。

摘要:
Facade(外观)模式是一种结构性设计模式,它通过提供一个统一的高层接口来简化复杂子系统的使用。该模式的意图是为子系统中的一组接口提供一致的界面,使其更容易被调用。

主要特点包括:

Facade类了解子系统的内部结构,将客户端请求代理给适当的子系统对象
子系统类实现具体功能,但不知道Facade的存在
适用于需要简化复杂系统接口、降低系统耦合度或构建层次化子系统的情况
示例代码展示了如何通过Facade类统一调用多个子系统的功能方法(methodOne、methodTwo等)。这种模式特别适合需要隐藏系统复杂性或提高系统可维护性的场景。

1)意图

为子系统中一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2)结构

在这里插入图片描述
其中:

  • Facade 知道哪些子系统类负责处理请求;将客户的请求代理给适当的子系统对象。
  • Subsystem classes 实现子系统的功能;处理有Facade对象指派的任务;没有Facade的任何相关信息,既没有指向Facade的指针。

3)适用于

Facade 模式适用于:

  • 要为一个复杂系统提供一个简单接口时。
  • 客户程序与抽象类的实现部分之间存在很大的依赖性。
  • 当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。
/*** @author psd 结构性设计模式之【Facade】外观模式*/
public class FacadeDemo {public static void main(String[] args) {Facade facade = new Facade();facade.methodOne();facade.methodTwo();facade.methodThree();}
}class Facade{private final FadeThree fadeThree;private final FacadeTwo fadeTwo;private final FacadeOne fadeOne;public Facade() {fadeThree = new FadeThree();fadeTwo = new FacadeTwo();fadeOne = new FacadeOne();}public void methodOne(){fadeOne.methodOne();}public void methodTwo(){fadeTwo.methodTwo();}public void methodThree(){fadeThree.methodThree();}
}class FadeThree{public void methodThree(){System.out.println("执行子任务第三个功能....");}
}class FacadeTwo{public void methodTwo(){System.out.println("执行子任务第二个功能....");}
}
class FacadeOne{public void methodOne(){System.out.println("执行子任务第一个功能....");}
}

要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过 Facade 层

客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

**当需要构建一个层次结构的子系统时,使用Facade 模式定义子系统中每层的入口点。**如果子系统之间是相互依赖的,则可以让它们仅通过 Facade 进行通信,从而简化了它们之间的依赖关系。

喜欢我的文章记得点个在看,或者点赞,持续更新中ing…

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

相关文章:

  • 34.2STM32下的can总线外设_csdn
  • 修改 Windows 10/11 的系统设置中显示的安装日期
  • CMake入门:1、环境搭建
  • 防火墙设置实战操作案例(小白的“升级打怪”成长之路)
  • FreeType 字体信息检查工具 - 现代C++实现
  • selenium学习实战【Python爬虫】
  • 【贪心、DP、线段树优化】Leetcode 376. 摆动序列
  • 当AI遇上防火墙:新一代智能安全解决方案全景解析
  • Elasticsearch中的自定义分析器(Custom Analyzer)介绍
  • 2025最新Java日志框架深度解析:Log4j 2 vs Logback性能实测+企业级实战案例
  • 一个完整的时间序列异常检测系统,使用Flask作为后端框架,实现了AE(自编码器)、TimesNet和LSTM三种模型,并提供可视化展示
  • Asp.Net Core基于StackExchange Redis 缓存
  • 使用TypeScript构建一个最简单的MCP服务器
  • PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小
  • 【从零学习JVM|第二篇】字节码文件
  • Android 项目的核心配置文件
  • 数据结构第一章
  • 边缘计算网关赋能沸石转轮运行故障智能诊断的配置实例
  • Flutter如何支持原生View
  • Unity安卓平台开发,启动app并传参
  • 如何配置一个sql server使得其它用户可以通过excel odbc获取数据
  • 【大模型:知识图谱】--5.neo4j数据库管理(cypher语法2)
  • rknn优化教程(一)
  • DPO算法微调实战
  • 微信小程序动态组件加载的应用场景与实现方式
  • 双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360°转向与速度控制
  • 分类预测 | Matlab实现CNN-BiLSTM-Attention高光谱数据分类预测
  • PostgreSQL的扩展 pg_buffercache
  • TDengine 开发指南——高效写入
  • ​BEV和OCC学习-3:mmdet3d 坐标系