设计模式 -- 外观模式(Facade Pattern)

1 问题引出

组建一个家庭影院

        DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:

        直接用遥控器:统筹各设备开关

        开爆米花机,放下屏幕 ,开投影仪 ,开音响,开 DVD,选 dvd,去拿爆米,花调暗灯光 ,播放影片,观影结束后,关闭各种设备。

2 传统方式解决

2.1 类图

2.2 说明

  1. 在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程

  2. 不利于在 ClientTest 中,去维护对子系统的操作

  3. 解决思路:定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法ready, play, pause, end ),用来访问子系统中的一群接口

  4. 也就是说 就是通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节 => 外观模式

3 基本介绍

  1. 外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

  2. 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。

4 原理结构

4.1 类图

4.2 说明

  1. 外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象

  2. 调用者(Client): 外观接口的调用者

  3. 子系统的集合:指模块或者子系统,处理 Facade 对象指派的任务,他是功能的实际提供者

5 应用实例

5.1 类图

5.2 代码实现

public class Client {public static void main(String[] args) {//  这里直接调用。。 很麻烦HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();homeTheaterFacade.ready();homeTheaterFacade.play();homeTheaterFacade.end();}}public class DVDPlayer {//  使用单例模式, 使用饿汉式private static DVDPlayer instance = new DVDPlayer();public static DVDPlayer getInstance() {return instance;}public void on() {System.out.println(" dvd on ");}public void off() {System.out.println(" dvd off ");}public void play() {System.out.println(" dvd is playing ");}//  ....public void pause() {System.out.println(" dvd pause ..");}
}public class HomeTheaterFacade {//  定义各个子系统对象private TheaterLight theaterLight;private Popcorn popcorn;private Stereo stereo;private Projector projector;private Screen screen;private DVDPlayer dVDPlayer;//  构造器public HomeTheaterFacade() {super();this.theaterLight = TheaterLight.getInstance();this.popcorn = Popcorn.getInstance();this.stereo = Stereo.getInstance();this.projector = Projector.getInstance();this.screen = Screen.getInstance();this.dVDPlayer = DVDPlayer.getInstanc();}//  操作分成 4 步public void ready() {popcorn.on();popcorn.pop();screen.down();projector.on();stereo.on();dVDPlayer.on();theaterLight.dim();}public void play() {dVDPlayer.play();}public void pause() {dVDPlayer.pause();}public void end() {popcorn.off();theaterLight.bright();screen.up();projector.off();stereo.off();dVDPlayer.off();}}

6 优缺点

6.1 优点

  1. 简化调用流程:外观模式通过提供一个高层级接口,显著简化了复杂系统的调用过程,对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
  2. 降低耦合度:通过一个外观类与多个子系统进行交互,减少了客户端与子系统之间的直接依赖,从而降低了系统间的耦合度。
  3. 提高灵活性:外观模式使得子系统内部的模块更容易扩展和维护,同时不影响客户端的调用方式。
  4. 符合迪米特法则:客户端不需要了解子系统内部的情况,只与外观类进行交互,符合最少知道原则,进一步降低了应用层与子系统之间的耦合度。

        在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性。

6.2 缺点

  1. 不符合开闭原则:一旦需要新增或修改子系统的功能,可能需要修改外观类,这违反了开闭原则。
  2. 存在扩展风险:在系统内部扩展子系统时,可能会引入新的风险和复杂性。
  3. 不适应大规模系统:对于极其复杂的系统,外观模式可能导致外观类变得庞大而复杂,增加了维护难度。
  4. 影响接口变动:子系统的任何改动都可能直接影响外观接口的行为,增加了系统的整体复杂性。
  5. 性能问题:由于引入了额外的外观层,可能会增加系统的调用层次,从而影响性能。

7 总结

        综上所述,外观模式提供了一种高效的管理树形结构的方式,适用于各种具有层次结构的场景。虽然其设计和实现相对复杂,但其带来的好处是显著的。在选择使用组合模式时,还是需要根据具体需求来决定其适用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412241.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】Kubernetes中如何通过Pod名称查询Docker容器ID,通过Docker容器ID查询Pod名称?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

FGF23:家族靶向治疗先行者

成纤维细胞生长因子23(FGF23)属于FGF19亚家族成员,由成骨细胞、骨细胞和骨髓合成,是磷酸盐和钙稳态的重要调节剂,同时与铁稳态、炎症和红细胞生成也有关。 (数据来源AlphaFold) FGF23由251个氨…

Git 学习

一、基本使用 1. 基本理论 Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的项目;版本控制是一种记录一个或者若干个文件内容变化,以便来查阅特定版本修订情况的系统 集中化版本控制系统:SVN, CV…

应急响应--日志分析

应急响应–日志分析 文章目录 一、Windows日志二、Linux日志三、Web日志 3.1、IIS中间件日志3.2、Apache中间件日志3.3、Tomcat中间件日志3.4、Weblogic3.5、Nginx中间件日志 一、Windows日志 Windows日志记录着Windows系统中硬件、软件和系统问题的信息,同时还…

基于imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 验证功能一、概述 本文档是针对imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流。首先创建一个线程opencv通过摄像头采集视频图像,接着再创建两个线程,其中一个线程获取采集的视频图…

如何让ChatGPT说话更像人类

ChatGPT在多个领域展现了卓越的能力,但对话中仍不可避免地带有一定的机械感。幸运的是,OpenAI推出的GPTs功能可以让用户自定义prompt。最近,我发现了其中一个GPTs,它能让ChatGPT的对话更加贴近真人,现在就来与大家分享…

基于RS232的VGA显示

前言 基于ROM的VGA显示缺点:需要将图片转化为mif文件,使用的RAM是FPGA内部RAM模拟出来的,占用资源大切换显示图片需要重新转化,对ROM进行写入,使用极不方便,因此这里采用RS232进行VGA显示。 正文 一、基于…

多线程篇(基本认识 - 锁机制 - 乐观锁 悲观锁)(持续更新迭代)

一、Java层 乐观锁(CAS)和悲观锁(synchronized) 1. 锁 在代码中多个线程需要同时操作共享变量,这时需要给变量上把锁,保证变量值是线程安全的。 锁的种类非常多,比如:互斥锁、自…

【功能自动化】自动识别测试用例

1.创建unitWebtours.py 将unitWebtours.py放在test文件夹下 unitWebtours.py 代码实现 from selenium import webdriver from selenium.webdriver.support.select import Select from time import sleep import unittestdriver Noneclass Webtours(unittest.TestCase):clas…

Ubuntu24.04 安装向日葵远程访问工具

目录 安装向日葵远程访问工具 解决方案: 1.下载软件包 2.远程Ubuntu桌面控制卡住 卸载向日葵远程访问工具 安装向日葵远程访问工具 安装命令:sudo dpkg -i 文件名.deb sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 提示错误如下&#xf…

三级_网络技术_54_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写路由器RG的路由表项。 目的网络/掩码长度输出端口__________S0(直接连接)__________S1(直接连接)__________S0__________S1__________S0__________S1 2.如果将10.10.67.128/2…

在 CentOS 7 上安装 LNMP 环境:MySQL 8.0、PHP 8.3 和 ThinkPHP 8.0

在 CentOS 7 上安装 LNMP 环境,并配置 MySQL 8.0、PHP 8.3 以及 ThinkPHP 8.0,能够为你的 web 应用程序提供一个强大的开发和运行环境。下面是详细的安装步骤: --- ## 在 CentOS 7 上安装 LNMP 环境:MySQL 8.0、PHP 8.3 和 Thin…

基于Leaflet Legend的图例数据筛选实践-以某市教培时空分布为例

目录 前言 一、关于Leaflet.Legend组件 1、Legend组件的主要参数 2、相关参数 二、Legend图例可视化控制 1、违规教培信息的管理 2、违规培训信息时空可视化及图例渲染控制 3、成果展示 三、总结 前言 在很多的地理时空分析系统中,我们经常会遇到一些需求。…

第一次使用PyCharm写C++(失败)

前言: 由于我已经非常习惯使用PyCharm远程连接服务器了,我认为非常方便,所以希望C也能直接用Pycharm。于是尝试在PyCharm上部署C环境。 但是,我失败了。如果您知道问题所在,欢迎给我留言。我认为Pycharm并没有编译C/C…

Fedora koji构建系统详细教程之二 -- 构建

写在前面 本篇文章是上一篇文章的继续,由于koji里面的内容实在是太多,都塞进一篇文章里会显得很臃肿,于是我就拆成了两部分。在上一篇文章里,我们已经部署好了Fedora koji系统,此时kojihub已经运行、可以通过kojiweb或…

IOS开发 铃声制作(库乐队)

IOS开发,实现铃声制作功能。 在IOS端,要设置铃声都是通过库乐队来制作的。 先看一下库乐队中铃声的文件结构。下面是弄的一个示例的文件,文件信息如下: 我们右击文件,点击显示包内容如下: 能看到一个aiff格…

Clickhouse集群化(一)k8s集群搭建

环境准备: vm 17 pro 有些功能必须pro版本才会提供(https://download.csdn.net/download/weixin_40663313/89677277?spm1001.2014.3001.5501)夸克下载链接 centos 7.9 docker:1.26 k8s:1.21.14 1. 创建虚拟机 …

2022 年高教社杯全国大学生数学建模竞赛-C 题 古代玻璃制品的成分分析与鉴别详解+分类模型Python代码源码

前言 简单介绍一下我自己:博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。参与过十余次数学建模大赛,三次美赛获得过二次M奖一次H奖,国赛二等奖。**提…

游戏引擎详解——图片

图片 图片的格式 图片文件格式pngjpg 纹理压缩格式ETC1/2PVRTCASTC 图片的属性 图片属性解释分辨率宽高像素值(pt),如:1024*1024位深度用来存储像素颜色的值,如RGBA8888,红黄蓝透明度4个维度每个8bit&…

深度解析HarmonyOS SDK实况窗服务源码,Get不同场景下的多种模板

HarmonyOS SDK实况窗服务(Live View Kit)作为一个实时呈现应用服务信息变化的小窗口,遍布于设备的各个使用界面,它的魅力在于将复杂的应用场景信息简洁提炼并实时刷新,在不影响当前其他应用操作的情况下,时…