Java设计模式:外观模式

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

文章目录

  • 一、外观模式的定义
  • 二、外观模式的结构
  • 三、外观模式的实现
  • 四、外观模式的优缺点
  • 五、外观模式的使用场景

一、外观模式的定义

外观模式(Facade Pattern)是一种结构型设计模式,旨在为系统提供一个 统一的接口,以简化系统的使用。它定义了一个高级接口,使得客户端可以更容易地与系统交互。

外观模式通过提供一个简化的接口,封装了系统中多个模块的复杂逻辑,从而隐藏系统的复杂性,使客户端更容易使用。这种模式的核心思想是通过一个外观类,将客户端与系统的详细实现隔离开来,提供一个更简单和统一的接口。


二、外观模式的结构

外观模式包含以下的重要角色:

  • 外观(Facade): 负责提供一个简化的高级接口,封装了系统中多个模块的复杂逻辑。客户端通过与外观交互来实现对系统的操作,而不直接与系统中的子系统打交道。
  • 子系统(Subsystem): 包含了系统中的多个模块,负责实际的业务逻辑。子系统是外观模式的核心,但客户端不直接与子系统交互,而是通过外观进行操作。

三、外观模式的实现

需求案例:假设要开发一个家庭电影院系统,其中包含了多个设备和模块,如投影仪、音响、灯光等。每个子系统都有各个独立的内部业务逻辑,而且彼此之间也有关联。现在,使用外观模式可以将这些复杂的子系统封装起来,为客户端提供一个简单的接口,方便控制整个家庭影院。

使用外观模式实现上述案例。类图如下:
在这里插入图片描述
 
具体的类设计如下:

子系统(投影仪):

public class Projector {public void turnOn() {System.out.println("投影仪已打开");}public void turnOff() {System.out.println("投影仪已关闭");}
}

子系统(音响):

public class AudioSystem {public void turnOn() {System.out.println("音响已打开");}public void turnOff() {System.out.println("音响已关闭");}
}

子系统(灯光):

public class Lights {public void turnOn() {System.out.println("灯光已打开");}public void turnOff() {System.out.println("灯光已关闭");}
}

外观类:

public class HomeTheaterFacade {//聚合投影仪对象、音响对象、灯光对象private Projector projector;private AudioSystem audioSystem;private Lights lights;public HomeTheaterFacade() {this.projector = new Projector();this.audioSystem = new AudioSystem();this.lights = new Lights();}//提供一个简单的接口,封装了启动家庭电影院的复杂逻辑public void startHomeTheater() {System.out.println("------启动家庭电影院------");projector.turnOn();audioSystem.turnOn();lights.turnOn();}//提供一个简单的接口,封装了关闭家庭电影院的复杂逻辑public void stopHomeTheater() {System.out.println("------关闭家庭电影院------");projector.turnOff();audioSystem.turnOff();lights.turnOff();}
}

客户端类:

public class Client {public static void main(String[] args) {//使用外观模式控制家庭电影院HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();//在这里还可以进行其他操作,而不用关系子系统的复杂逻辑homeTheaterFacade.startHomeTheater();homeTheaterFacade.stopHomeTheater();}
}

测试结果如下:
在这里插入图片描述
 
可以看到,在上述例子中 HomeTheaterFacade 充当外观,封装了启动和关闭家庭影院的复杂逻辑。客户端只需要与外观交互,而不需要直接与投影仪、音响、灯光等子系统打交道,从而简化了系统的使用。


四、外观模式的优缺点

优点:

  1. 简化接口: 外观模式提供了一个简化的高层接口,隐藏了底层子系统的复杂性,使客户端更容易使用。
  2. 解耦系统: 外观模式将客户端与底层子系统之间的耦合度降低,客户端只需要与外观对象进行交互,而不需要直接与子系统进行交互,从而减少了客户端与子系统之间的依赖关系。
  3. 提高可维护性: 由于外观模式将复杂的子系统封装在外观对象中,如果子系统发生变化,只需修改外观对象而不需要修改客户端代码,从而提高了系统的可维护性。
  4. 提供了灵活性: 外观模式可以为不同的客户端提供不同的简化接口,根据客户端的需求进行定制,从而提供了灵活性。

缺点:

  1. 违反开闭原则: 如果需要新增或修改子系统的功能,可能需要修改外观类的代码,这违反了开闭原则。
  2. 过于简化接口: 外观模式的目的是简化子系统的接口,但有时可能会导致接口过于简化,无法满足某些特定需求,此时可能需要直接访问子系统。
  3. 不符合单一职责原则: 外观对象负责协调子系统的工作,可能承担了过多的责任,不符合单一职责原则。

五、外观模式的使用场景

外观模式适用于以下场景:

  1. 简化复杂的子系统: 当一个系统有多个复杂的子系统,而客户端只需要使用其中一部分功能时,可以使用外观模式将子系统的复杂性封装起来,提供一个简化的接口给客户端使用。
  2. 解耦客户端和子系统: 将客户端与底层子系统之间的依赖关系解耦,通过外观模式可以隐藏子系统的复杂性,从而降低耦合度,减少客户端与子系统之间的直接交互。
  3. 提供统一的接口: 一个系统的接口过于复杂,难以理解和使用时,可以使用外观模式提供一个简化的接口,将复杂的操作封装在外观类中,使得客户端更容易使用系统。
  4. 系统重构与维护: 外观模式可以作为系统重构的一种手段,通过引入外观类来封装和简化现有的子系统,提高系统的可维护性和可读性。

 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

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

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

相关文章

ArcGIS学习(十四)OD分析

ArcGIS学习(十四)OD分析 1.上海市KFC与麦当劳的空间聚集度分析 本任务给大家带来的内容是网络节点关系分析。网络节点关系分析一般也叫OD分析。“O”指的是起点(ORIGIN),"D”指的是终点(DESTINATION),0D分析即为基于起点到终点的分析。 网络节点关系分析我们经常…

基于springboot的厨艺交流平台

采用技术 基于springboot的厨艺交流平台的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示 食材分类管理 用户信息管理 菜谱分类管理 菜谱信息管理 食材信息…

Swarm集群负载均衡的实现方式

目录 1. 背景2. 参考3. 环境4. 概念5. Swarm 网络5.1 Swarm 网络连接情况5.2 外部访问数据包转发流程 6 Swarm集群服务信息7 Swarm集群数据包转发流程7.1 Client发送请求至集群节点9090端口7.1.1 集群节点宿主机Netfilter规则7.1.2 Tcpdump抓包验证结果 7.2 Ingress_sbox下IPVS…

【漏洞复现】网康NS-ASG应用安全网关 index.php SQL注入漏洞(CVE-2024-2330)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和 IPSecQ,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短…

Hadoop学习3:问题解决

文章目录 问题解决1. ERROR: but there is no HDFS_NAMENODE_USER defined2. JAVA_HOME is not set and could not be found.3. Hadoop-DFS页面访问不了4. namenode格式化失败,或者dfs页面打开失败5. ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Ab…

《ElementPlus 与 ElementUI 差异集合》el-input 和 el-button 属性 size 有变化

差异 element-ui el-input 和 el-button 中,属性size 值是 medium / small / minielement-plus el-input 和 el-button 中,属性size 值是 ‘large’ | ‘default’ | ‘small’; 如果你是自动升级,Vue3 系统会有如下警告“ el-b…

机器学习模型—支持向量机 (SVM)

机器学习模型—支持向量机 (SVM) 支持向量机 (SVM) 是一种强大的机器学习算法,用于线性或非线性分类、回归,甚至异常值检测任务。SVM 可用于各种任务,例如文本分类、图像分类、垃圾邮件检测、笔迹识别、基因表达分析、人脸检测和异常检测。SVM 在各种应用中具有适应性和高效…

使用C#创建服务端Web API

前言 C# Web API 是一种基于 .NET 平台(包括但不限于.NET Framework 和 .NET Core)构建 HTTP 服务的框架,用于创建 RESTful Web 服务。REST(Representational State Transfer)是一种软件架构风格,它利用HT…

前端食堂技术周刊第 115 期:Rolldown 正式开源、马斯克宣布 xAI 本周将开源 Grok、如何使用 Copilot 完成 50% 的日常工作?

美味值:🌟🌟🌟🌟🌟 口味:手打柠檬茶 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看…

“antd“: Unknown word.cSpell

你遇到的问题是 VS Code 的 Code Spell Checker 插件在检查拼写时,将 "antd" 标记为未知单词。"antd" 是 Ant Design 的缩写,是一个流行的 React UI 库,不是一个英语单词,所以 Spell Checker 会将其标记为错误…

SpringBoot 多环境的配置(附带有截图)

文章目录 概要整体配置流程配置详细说明技术细节小结 概要 多环境开发 在实际项目开发中,一般需要针对不同的运行环境,如开发环境、测试环境、生产环境等,每个运行环境的数据库等配置都不相同,每次发布测试、更新生产都需要手动…

2024蓝桥杯每日一题(时间日期)

一、第一题:日期差值 解题思路:模拟 写一个计算时间的板子两者相减 【Python程序代码】 mon [0,31,28,31,30,31,30,31,31,30,31,30,31] def pd(x):if x%4000 or (x%40 and x%100!0):return Truereturn False def get_day(y,m,d):res 0for i …

代码学习记录16

随想录日记part16 t i m e : time: time: 2024.03.11 主要内容:今天的主要内容是二叉树的第五部分,主要涉及最大二叉树;合并二叉树;二叉搜索树的搜索;验证二叉搜索树。 654.最大二叉…

sensitive-word 敏感词 违规文字检测

1、快速开始 - JDK1.7- Maven 3.x 2、Maven 引入 <!-- https://mvnrepository.com/artifact/com.github.houbb/sensitive-word --><dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version…

案例分析篇02:软件架构设计考点之特定领域软件架构、架构评估、架构视图(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

VMD + CEEMDAN 二次分解,CNN-LSTM预测模型

目录 往期精彩内容&#xff1a; 前言 1 二次分解与数据集制作 1.1 导入数据 1.2 VMD分解 1.3 样本熵 1.4 CEEMDAN分解 1.5 数据集制作 2 基于Pytorch的 CNN-LSTM 预测模型 2.1 定义CNN-LSTM预测模型 2.2 设置参数&#xff0c;训练模型 3 模型评估与可视化 3.1 结果…

北京市行政村边界shp数据/北京市乡镇边界/北京市土地利用分类数据

北京是一座有着三千多年历史的古都&#xff0c;在不同的朝代有着不同的称谓&#xff0c;大致算起来有二十多个别称。北京地势西北高、东南低。西部、北部和东北部三面环山&#xff0c;东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有&#xff1a;永定河、潮白河、北运…

1.4 Word2Vec是如何工作的? Word2Vec与LDA 的区别和联系?

1.4 Word2Vec&#xff1a;词嵌入模型之一 场景描述 谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。 Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构&#xff0c;分别是CBOW(Continues Bag of Words)和Skip-gram。 知识点 Word2Vec,隐狄利克雷模型(LDA),…

ChatGPT国内能用吗?中国用户怎么才能使用ChatGPT?

与ChatGPT类似的国内网站&#xff0c;他们都能提供和ChatGPT相似的能力&#xff0c;而且可以在国内直接使用。 点击直达方式 百科GPT官网&#xff1a;baikegpt.cn ChatGPT是基于GPT-3.5架构的语言模型的一个实例&#xff0c;由OpenAI开发。以下是ChatGPT的发展历史&#xff1…

【办公类-40-01】20240311 用Python将MP4转MP3提取音频 (家长会系列一)

作品展示&#xff1a; 背景需求&#xff1a; 马上就要家长会&#xff0c;我负责做会议前的照片滚动PPT&#xff0c;除了大量照片视频&#xff0c;还需要一个时间很长的背景音乐MP3 一、下载“歌曲串烧” 装一个IDM 下载三个“串烧音乐MP4”。 代码展示 家长会背景音乐: 歌曲串…