Java23种设计模式-结构型模式之外观模式

外观模式(Facade Pattern):为复杂的系统提供了一个简单的统一接口,使得系统更易于使用和理解(对外提供一个统一的方法,来访问子系统中的一群接口

外观模式三个核心角色:
角色1.外观(Facade):外观类提供了一个简化的接口,封装了系统的复杂性。
角色2.子系统(Subsystem):子系统由多个相互关联的类组成,负责系统的具体功能。
角色3.客户端(Client):客户端则使用外观对象来与系统交互,而不需要了解系统内部的具体实现

优点:
1.简化接口:隐藏了系统的复杂细节,提供了一个简单的、高层的接口。
2.提高易用性:使得系统更容易被使用和理解。
3.降低耦合性:减少了系统各部分之间的依赖和耦合。
4.更好的可维护性:便于系统的维护和扩展。

缺点:
1.不符合开闭原则:在某些情况下,对系统的修改可能需要修改外观类,这违反了开闭原则。
2.灵活性受限:外观类的设计可能会限制系统的灵活性。
3.可能增加复杂度:如果外观类过于复杂,可能会增加系统的整体复杂度。
4.依赖性:客户端可能会过度依赖外观类,导致代码难以移植和维护。
5.性能影响:通过外观类进行交互可能会引入一定的性能开销。
6.代码可读性降低:过于复杂的外观类可能会降低代码的可读性。

应用场景
1.复杂的子系统集成。
2.提供一个统一的接口来访问多个不同的系统或模块。
3.简化复杂的系统,使其更易于使用和管理。

示例
ComputerFacade类作为外观类,它封装了对CPU、Memory和HardDrive类的操作,客户端只需要与ComputerFacade类交互,从而简化了客户端Demo的代码

//定义子系统接口和类
public class CPU {public void freeze(){System.out.println("CPU freeze");}public void jump(long position){System.out.println("CPU jump to position"+position);}public void execute(){System.out.println("CPU execute.");}
}
public class Memory {public void load(long position,byte[] data){System.out.println("Memory load from position"+position);}
}
public class HardDrive {public byte[] read(long lba,int size){System.out.println("Hard drive read lba"+lba+"size"+size);return new byte[0];}
}
//创建外观类
public class ComputerFacade {private static final long BOOT_ADDRESS = 0x0000fff0L;private static final long BOOT_SECTOR = 0x00007C00L;private static final int SECTOR_SIZE = 512;private CPU cpu;private Memory memory;private HardDrive hardDrive;public ComputerFacade() {this.cpu = new CPU();this.memory = new Memory();this.hardDrive = new HardDrive();}public void start(){cpu.freeze();memory.load(BOOT_ADDRESS,hardDrive.read(BOOT_SECTOR,SECTOR_SIZE));cpu.jump(BOOT_ADDRESS);cpu.execute();}
}
//Demo
public class FacadePatternDemo {public static void main(String[] args) {ComputerFacade computer = new ComputerFacade();computer.start();}
}

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

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

相关文章

信息系统项目管理师论文考察范围预测

在2023年下半年实施机考之前,论文的范围还是比较好预测的,因为从历年考题来看,可以说十大管理领域考察的概率接近100%,而且有一定规律,比如说某个管理领域很久没考了,那么考察的概率就相对大一点&#xff0…

力扣爆刷第126天之动态规划五连刷(斐波那契、爬楼梯、不同路径)

力扣爆刷第126天之动态规划五连刷(斐波那契、爬楼梯、不同路径) 文章目录 力扣爆刷第126天之动态规划五连刷(斐波那契、爬楼梯、不同路径)一、509. 斐波那契数二、70. 爬楼梯三、746. 使用最小花费爬楼梯四、62. 不同路径五、63. …

前端算法

4大算法: 贪心算法:局部最优解分治算法:将一个问题分成多个小模块动态规划:每一个状态都是过去历史的总结回溯算法:不是最优选择的时候退回重新选 一、排序算法 1. 冒泡排序:数字越大越往上 第一次循环 比…

Docker创建enrollment token错误异常

问题 部署完kibana,需要通过enrollment token方式来连接elasticsearch,此时需要在elasticsearch中创建enrollment token。 执行创建命令时,报如下错误: elasticsearch-create-enrollment-token --scope kibanaERROR: [xpack.se…

IDEA 全局查找 ctrl + shift + F 快捷键失效

全局查找:ctrl shift F 需要关闭微软输入法简体/繁体切换,不然被占用了无效 (装了搜狗输入法的同理,找一下是不是这个快捷键冲突了 ) 另外还有 IDEA 中 重构变量名 :shift F6 需要关闭微软输入法最新版本 ( 使用以前版本的微软输入法就没…

CSS渐变色理论与分类、文字渐变色方案、炸裂渐变色方案以及主流专业渐变色工具网站推荐

渐变色彩可以增加视觉层次感和动态效果,使网页界面更加生动有趣,吸引用户注意力。另外,相较于静态背景图片,CSS渐变无需额外的HTTP请求,减轻服务器负载,加快页面加载速度;同时CSS渐变能够根据容…

Qt——QGridLayout

1. 设置单元格比例 在Qt中,如果你想设置网格布局(QGridLayout)中单元格的比例,你需要使用QGridLayout的拉伸系数(stretch factors)来控制行和列的相对大小。你可以通过调用setRowStretch和setColumnStretch…

windows下git提交修改文件名大小写提交无效问题

windows系统不区分大小写,以及git提交忽略大小写,git仓库已存在文件A.js,本地修改a.js一般是没有提交记录的,需要手动copy一份出来A.js,再删除A.js文件提交仓库删除后,再提交修改后的a.js文件。 windows决…

【八股】synchronized

synchronized关键字的底层原理? synchronized是Java中用于实现同步的关键字,每个对象内部都有一个锁(也称为监视器锁或互斥锁), 而synchronized就是一种用来获取或释放这个锁的机制。 他的底层是由monitor实现的&…

C/C++程序设计实验报告4 | 函数实验

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告,适合C语言初学者们学习、练习。 编译器:gcc 10.3.0 ---- 注: 1.虽然课程名为C程序设计,但实际上当时校内该课的内容大部分其实都是C语言,C的元素最多可能只…

SV-7041T IP网络有源音箱 教室广播多媒体音箱(带本地扩音功能)教学广播音箱 办公室背景音乐广播音箱 2.0声道壁挂式网络有源音箱

SV-7041T IP网络有源音箱 教室广播多媒体音箱(带本地扩音功能) 教学广播音箱 办公室背景音乐广播音箱 一、描述 SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带…

tailwindcss在使用cdn引入静态html的时候,vscode默认不会提示问题

1.首先确保vscode下载tailwind插件:Tailwind CSS IntelliSense 2.需要在根目录文件夹创建一个tailwind.config.js文件 export default {theme: {extend: {// 可根据需要自行配置,空配置项可以正常使用},}, }3.在html文件的标签中引入配置文件&#xf…

【JavaScript】axios

基础使用 <script src"https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.min.js"></script> <script>axios.get(https://study.duyiedu.com/api/herolist).then(res> {console.log(res.data)}) </script>get - params <script s…

数据仓库与数据挖掘(实验一2024.4.24)

实验准备&#xff1a; 1.下载conda 2.配置环境C:\ProgramData\miniconda3\Scripts 3.创建文件夹panda进入虚拟环境qq 激活虚拟环境&#xff1a;activate qq 启动jupyter lab&#xff08;python语言环境编译&#xff09;&#xff1a;jupyter lab 4.panda下载 &#xff08;…

Docker容器通俗讲解

Docker容器通俗讲解 摘要&#xff1a; 本文旨在以通俗易懂的语言介绍Docker容器技术&#xff0c;包括其定义、原理、优势以及在实际应用中的案例。通过阅读本文&#xff0c;读者将能够理解Docker容器的基本概念和工作机制&#xff0c;并认识到其在现代软件开发和运维中的重要性…

【工具类】正则表达式过滤器(过滤日志、过滤文件)

1. 【工具类】正则表达式过滤器(过滤日志、过滤文件) 1. 【工具类】正则表达式过滤器(过滤日志、过滤文件) 1.1. 划重点1.2. 参数说明1.3. 正则表达式 regular.json 内容如下1.4. 举例1.5. 代码说明 1.1. 划重点 功能&#xff1a; python实现的支持对文件进行正则表达式过滤…

HTB Runner

Runner User Nmap ──(root㉿kali)-[/home/…/machine/SeasonV/linux/Runner] └─# nmap -A runner.htb -T 4 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-22 23:07 EDT Stats: 0:00:01 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Sca…

用户中心 -- 代码理解

一、删除表 & if 删除表 1.1 DROP TABLE IF EXISTS user 和 DROP TABLE user 网址&#xff1a; 用户管理第2节课 -- idea 2023.2 创建表--【本人】-CSDN博客 二、 代码 2.1 清空表中数据 的 命令 【truncate 清空】 网址&#xff1a; 用户管理第2节课 -- idea 2…

iOS开发进阶(二十):Xcode 断点调试详解

文章目录 一、前言二、断点调试技巧2.1 设置断点2.2 断点的自定义设置2.3 断点类型 一、前言 所谓断点&#xff0c;其实就是一个让应用暂停运行的机制&#xff0c;这是为了方便开发人员执行调试&#xff0c;查看寄存器的某些值。既然设置了断点&#xff0c;可以让应用停在某一…

Ajax和axios基础

AJAX Asynchronous JavaScript And XML 异步的JavaScript和XML 作用 数据交换: 通过Ajax可以给服务器发送请求,服务器将数据直接响应回给浏览器. 异步交互: 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术. 同步和异步 同步发送请求: 浏览器发…