设计模式使用场景实现示例及优缺点(结构型模式——外观模式)
在一个繁忙而复杂的城市中,有一座名为“技术森林”的巨大图书馆。这座图书馆里藏着各种各样的知识宝典,从古老的卷轴到现的电子书籍,无所不包。但是,图书馆之所以得名“技术森林”,是因为它的结构异常复杂,有如一片迷宫般的森林,让人一不小心就会迷失方向在这座城市里,有一个年轻的程序员小李,他对软件设计充满了热情。一天,他接到了一个艰巨的任务,需要从“技术森林”中找到关于“外观模式”(Facade
Pattern)的资料,以帮助他简化即将开发的复杂系统的接口。小李进入图书馆,立刻被无数的书架、抽屉和电子屏幕所困扰。他尝试了多种搜索方法,但每次都因为系统过于复杂而放弃。正当他感到绝望时,他遇到了一位智慧的老图书管理员,名叫赵先生。
赵先生了解到小李的困境后,微笑着从他的桌子下拿出了一本古老的书籍,书名为《设计模式之美》。赵先生解释说:“这本书就像是我们图书馆的‘外观’,它提供了一个简单的接口,将复杂的知识系统背后的信息以最简洁的方式展现给寻求知识的人。”
小李翻开书籍,只见其中有一章节详细介绍了外观模式。外观模式通过创建一个统一的高层接口,使得子系统更加易于使用和维护。这正是小李需要的解决方案,他可以通过这种模式来简化自己的软件项目,使得复杂的底层操作对最终用户保持透明和简单。
外观模式(Facade Pattern)
外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的接口,用来访问子系统中的一群接口,从而让复杂子系统更容易使用。外观模式定义了一个高层接口,使得这一子系统更加容易使用。
适用场景
-
简化复杂系统的接口:
- 为复杂的子系统提供一个简单的接口,减少外部与子系统的交互复杂度。
-
层次结构:
- 在多层系统结构中,可以使用外观模式定义每层的入口,简化层之间的依赖关系。
-
解耦系统:
- 通过引入外观模式,使得子系统与客户端之间的耦合度降低。
实现示例(Java)
以下是一个简单的外观模式的实现示例,展示如何通过外观类简化对子系统的使用。
1. 定义子系统类
public class SubsystemA {public void operationA() {System.out.println("SubsystemA: operationA");}
}public class SubsystemB {public void operationB() {System.out.println("SubsystemB: operationB");}
}public class SubsystemC {public void operationC() {System.out.println("SubsystemC: operationC");}
}
2. 定义外观类
public class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {this.subsystemA = new SubsystemA();this.subsystemB = new SubsystemB();this.subsystemC = new SubsystemC();}public void operation1() {System.out.println("Facade: operation1");subsystemA.operationA();subsystemB.operationB();}public void operation2() {System.out.println("Facade: operation2");subsystemB.operationB();subsystemC.operationC();}
}
3. 客户端代码
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.operation1();facade.operation2();}
}
注释说明
-
子系统类:
SubsystemA,SubsystemB, 和SubsystemC是子系统的具体实现类,每个类都有自己独特的操作方法。
-
外观类:
Facade类持有子系统的对象,并提供简化的接口operation1和operation2来调用子系统的功能。
-
客户端代码:
Client类通过Facade类来调用operation1和operation2,从而简化了对复杂子系统的使用。
优点
-
简化接口:
- 外观模式为子系统提供了一个简单的接口,减少了与子系统交互的复杂度。
-
松散耦合:
- 外观模式使得子系统与客户端之间的耦合度降低,有助于提高系统的可维护性和扩展性。
-
更好的分层:
- 外观模式有助于建立一个清晰的分层结构,定义每层的入口。
缺点
-
不符合开闭原则:
- 增加新的子系统功能时,可能需要修改外观类,违背了开闭原则(对扩展开放,对修改关闭)。
-
可能造成性能问题:
- 在某些情况下,使用外观模式可能会导致系统性能下降,因为所有请求都需要经过外观类。
类图
Client|v
Facade ----> SubsystemA----> SubsystemB----> SubsystemC
总结
外观模式通过提供一个简化的接口,使得复杂子系统的使用变得更加容易。它适用于需要简化子系统接口、减少客户端与子系统直接交互、解耦系统层次结构的场景。尽管它有可能违反开闭原则,但在大多数情况下,它的优点远远超过其缺点,使得系统设计更加清晰和易于维护。
相关文章:
设计模式使用场景实现示例及优缺点(结构型模式——外观模式)
在一个繁忙而复杂的城市中,有一座名为“技术森林”的巨大图书馆。这座图书馆里藏着各种各样的知识宝典,从古老的卷轴到现的电子书籍,无所不包。但是,图书馆之所以得名“技术森林”,是因为它的结构异常复杂,…...
Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案本方案的缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡…...
加拿大上市药品查询-加拿大药品数据库
在加拿大,药品的安全性、有效性和质量是受到严格监管的。根据《食品药品法案》的规定,所有药品制造商必须提供充分的科学证据,证明其产品的安全性和有效性。为此,加拿大卫生部建立了一个全面的药品数据库 (DPD) &#…...
qt自定义控件(QLabel)
先创建自定义控件类painter_label 1.自定义类必须给基类传入父窗口指针 2.重写控件中的方法 3.在UI中创建一个QLabel,右键“提升为”,输入类名...
阿里云国际站:海外视频安全的DRM加密
随着科技的进步,视频以直播或录播的形式陆续开展海外市场,从而也衍生出内容安全的问题,阿里云在这方面提供了完善的内容安全保护机制,适用于不同的场景,如在视频安全提供DRM加密。 由图可以了解到阿里云保护直播安全的…...
【Apache Doris】周FAQ集锦:第 15 期
【Apache Doris】周FAQ集锦:第 15 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户…...
verilog实现ram16*8 (vivado)
module ram_16x2 (input clk, // 时钟信号input we, // 写使能input en, // 使能信号input [3:0] addr, // 地址线input [1:0] datain, // 输入数据线output reg [1:0] dataout // 输出数据线 );// 定义存储器数组reg [1:0] mem [15:0];always (posedge…...
框架使用及下载
Bootstrap5 安装使用 | 菜鸟教程 (runoob.com) https://github.com/twbs/bootstrap/releases/download/v5.1.3/bootstrap-5.1.3-dist.zip(下载链接) Staticfile CDN(html的所有框架合集) 直接在w3cschool里面看参考文件进行搜索自…...
通用图形处理器设计GPGPU基础与架构(四)
一、前言 本文将介绍GPGPU中线程束的调度方案、记分牌方案和线程块的分配与调度方案。 二、线程束调度 在计算机中有很多资源,既可以是虚拟的计算资源,如线程、进程或数据流,也可以是硬件资源,如处理器、网络连接或 ALU 单元。调…...
会Excel就会sql?
如果你熟悉Excel,理解SQL(结构化查询语言,Structured Query Language)会相对容易,因为它们在某些功能上有着相似之处。SQL主要用于管理和操作数据库中的数据,而Excel则是电子表格软件,用于数据的组织、分析和可视化。下面我会用Excel的视角来帮你理解SQL的基本概念。 数…...
MyBatis-Plus的几种常见用法
MyBatis-Plus 提供了丰富的高级用法,可以简化开发,提高效率。以下是一些常见的可能会被忽略的用法示例。 1. 乐观锁 乐观锁用于避免在并发环境下数据更新冲突。MyBatis-Plus 通过注解和版本字段实现乐观锁。 示例: 在实体类中添加版本字段…...
【LeetCode】day15:110 - 平衡二叉树, 257 - 二叉树的所有路径, 404 - 左叶子之和, 222 - 完全二叉树的节点个数
LeetCode 代码随想录跟练 Day15 110.平衡二叉树257.二叉树的所有路径404.左叶子之和222.完全二叉树的节点个数 110.平衡二叉树 题目描述: 给定一个二叉树,判断它是否是 平衡二叉树 平衡二叉树的定义是,对于树中的每个节点,其左右…...
【网络安全的神秘世界】Error:Archives directory /var/cache/apt/archives/partial is missing.
🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨问题描述 在kali中想要安装beef-xss软件包时,发生如下报错: Error: Archives directory /var/cac…...
网络编程中的TCP和UDP
什么是TCP协议 TCP( Transmission control protocol )即传输控制协议,是一种面向连接、可靠的数据传输协议,它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 :数据传输之前客户端和服务器端必须建立连…...
基于python的时空地理加权回归(GTWR)模型
一、时空地理加权回归(GTWR)模型 时空地理加权回归(GTWR)模型是由美国科罗拉多州立大学的Andy Liaw、Stanley A. Fiel和Michael E. Bock于2008年提出的一种高级空间统计分析方法。它是在传统地理加权回归(GWR…...
什么是单例模式,有哪些应用?
目录 一、定义 二、应用场景 三、6种实现方式 1、懒汉式,线程不安全。 2、懒汉式,线程安全 3、双检锁/双重校验锁(DCL,即 double-checked locking) 4、静态内部类方式-------只适用于静态域 5、饿汉式 6、枚举…...
adb命令操作手机各种开关
打开iqoo手机热点设置 adb shell am start -n com.android.settings/com.android.settings.Settings$\VivoTetherSettingsActivity蓝牙模块 检查蓝牙状态的ADB命令 检查蓝牙开关状态 adb shell settings get global bluetooth_on开启和关闭蓝牙 使用Intent操作蓝牙…...
【分布式存储系统HDFS】架构和使用
分布式存储系统HDFS:架构和使用 目录 引言HDFS简介HDFS的架构 NameNodeDataNodeSecondary NameNode HDFS的工作原理 数据读写流程数据冗余与恢复 HDFS的安装和配置 环境准备HDFS安装步骤HDFS配置文件启动HDFS HDFS的使用 基本命令HDFS Shell操作Java API操作 HDFS…...
Linux 实验一Linux系统安装
一、实验日期与地址 1、实验日期:2024年 2 月28 日 2、实验地址:S1-504 二、实验目的 1、掌握VMware Workstation建立虚拟机 2、掌握虚拟机环境下安装Centos 7 三、实验环境 VMware Workstation、Centos 7 四、实验内容 1、安装VMware Workstat…...
【人工智能】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题
文章目录 🍊1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 🍊2 建构AIGC伦理观:实现人机共创的永续提升2.1 技术手段与伦理预防2.2 即时警告与紧急关停措施2.3 法…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
