外观模式 rust和java的实现
文章目录
- 外观模式
- 介绍
- 实现
- java
- rust
- rust仓库
外观模式
外观模式(Facade Pattern)隐藏系统的复杂性,它为子系统中的一组接口提供一个统一的高层接口,使得这些接口更加容易使用。外观模式通过封装子系统内部的复杂性,提供一个简单的接口,使得外部调用者无需了解子系统内部的处理细节,就可以完成复杂的操作。
举个例子 :就像电脑的usb接口,自己内部实现了复杂的usb协议,自己却只提供了接口,让我们能够即插即用向我们屏蔽了,底层协议的细节。
介绍
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。
应用实例:
去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
实现
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMaker。 我们采用把所有的实现类封装在shapemaker,由shapemaker提供统一的接口,使我们能够方便调用。
ShapeMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo 类使用 ShapeMaker 类来显示结果。
外观模式的 UML 图

java
步骤 1
创建一个接口。
Shape.java
public interface Shape {void draw();
}
步骤 2
创建实现接口的实体类。
Rectangle.java
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Rectangle::draw()");}
}
Square.java
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Square::draw()");}
}
Circle.java
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Circle::draw()");}
}
步骤 3
创建一个外观类,这个外观类中,封装装了上述实现类的方法,这样我们就可以通过外观类中提供的方法,间接调用底层继承shape抽象类的实体类实现的方法。
ShapeMaker.java
public class ShapeMaker {private Shape circle;private Shape rectangle;private Shape square;public ShapeMaker() {circle = new Circle();rectangle = new Rectangle();square = new Square();}public void drawCircle(){circle.draw();}public void drawRectangle(){rectangle.draw();}public void drawSquare(){square.draw();}
}
步骤 4
使用该外观类画出各种类型的形状,由下面的代码我们可以看到,我们可以调用shapemaker的方法间接调用底层实现类的方法。
FacadePatternDemo.java
public class FacadePatternDemo {public static void main(String[] args) {ShapeMaker shapeMaker = new ShapeMaker();shapeMaker.drawCircle();shapeMaker.drawRectangle();shapeMaker.drawSquare(); }
}
步骤 5
执行程序,输出结果:
Circle::draw()
Rectangle::draw()
Square::draw()
rust
rsut实现的大致思路和java相同,就不再赘述过程。
// 创建形状接口
trait Shape {fn draw(&self);
}
struct Rectangle {}
struct Circle{}
struct Square{}
impl Shape for Rectangle {fn draw(&self) {println!("Shape: Rectangle");}
}
impl Shape for Circle {fn draw(&self) {println!("Shape: Circle");}
}
impl Shape for Square {fn draw(&self) {println!("Shape: Square");}
}
// 创建外观
struct ShapeMaker{rectangle:Rectangle,circle:Circle,square:Square
}
impl ShapeMaker {fn draw_rectangle(&self) {self.rectangle.draw();}fn draw_circle(&self) {self.circle.draw();}fn draw_square(&self) {self.square.draw();}
}
fn main() {//创建接口实体let shape_maker=ShapeMaker{rectangle:Rectangle { },circle:Circle { },square:Square { }};// 体现接口抽象实现的各种方法shape_maker.draw_circle();shape_maker.draw_rectangle();shape_maker.draw_square();
}
rust仓库
https://github.com/onenewcode/design.git
本教程项目在bin文件夹下的facade.rs文件中
相关文章:
外观模式 rust和java的实现
文章目录 外观模式介绍实现javarustrust仓库 外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,它为子系统中的一组接口提供一个统一的高层接口,使得这些接口更加容易使用。外观模式通过封装子系统内部的复杂性,提…...
uniapp-hubildx配置
1.配置浏览器 (1)运行》运行到浏览器配置》配置web服务器 (2)选择浏览器安装路径 (3)浏览器安装路径: (3.1) 右键点击图标》属性 (3.2)选择目标&…...
Nginx基础篇:Nginx搭建、Nginx反向代理、文件服务器部署配置。
Nginx Linux系统安装以及反向代理的配置 简介优点nginx 环境安装常用Nginx 命令nginx 文件服务器搭建 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点…...
什么是TDR(威胁检测与响应)
网络安全是被动和主动方法的混合体。过去,企业往往局限于被动的方法,随着合规性和安全策略越来越受到重视,主动方法也越来越受到关注。与其他行业相比,网络安全是高度动态的,网络安全团队采用任何可以帮助他们优化的新…...
30、pytest入门内容回顾
整体结构 解读与实操 pytest30讲主要从四个方面由浅入深的进行解读, 开始 讲解了pytest的概述,安装前的准备工作(python,pycharm,pytest),运行方式(命令行),断言(assert…...
2023年 - 我的程序员之旅和成长故事
2023年 - 我的程序员之旅和成长故事 🔥 1.前言 大家好,我是Leo哥🫣🫣🫣,今天咱们不聊技术,聊聊我自己,聊聊我从2023年年初到现在的一些经历和故事,我也很愿意我的故事分…...
JMH性能测试
一、JMH JMH,全称Java Microbenchmark Harness(微基准测试框架),是专门用于Java代码微基准测试的一套测试工具API,是由Java虚拟机团队开发的,一般用于代码的性能调优。 BenchMark又叫做基准测试,…...
超完整的mysql安装配置方法(包含idea和navicat连接mysql,并实现建表)
mysql安装配置方法 1、下载mysql2、解压到指定的安装目录3、配置初始化文件my.ini4、配置用户变量和系统变量5、初始化mysql6、安装mysql服务并启动修改密码7、使用idea连接mysql8、使用Navicat可视化工具连接mysql,并实现新建数据库,新建表 1、下载mysq…...
通过仿真理解完整的阵列信号噪声模型
概要 噪声对无线电设备的信号接收会造成影响,是通信、雷达、导航、遥感等工程应用领域中的关键考虑因素。通常认为阵列合成能够提升信噪比,但忽略了这一论断的前提,即不同通道引入的噪声互不相关。但实际应用中,接收的噪声不仅仅包含信道引入的不相关噪声,还包含从外界环…...
问题:数组对象去重
问题:数组对象去重 var arr [{name: ‘a’,id: 1}, {name: ‘a’,id: 2}, {name: ‘b’,id: 3}, {name: ‘c’,id: 4}, {name: ‘c’,id: 6}, {name: ‘b’,id: 6}, {name: ‘d’,id: 7}]; 对数组对象name进行去重处理, 结果显示为: [{name…...
前端:让一个div悬浮在另一个div之上
使用 CSS 的 position 属性和 z-index 属性 首先,将第二个 div 元素的 position 属性设为 relative 或 absolute。这样可以让该元素成为一个定位元素,使得后代元素可以相对于它进行定位。 然后,将要悬浮的 div 元素的 position 属性设为 ab…...
千锋 Vue 详细笔记整理
视频笔记是根据B站 千锋 涛哥 - SpringBootvue前后端分离项目《锋迷商城》实战课-完结版 进行整理的 笔记可上 gitee仓库 自取 千锋 Vue 笔记整理 一、vue 的简介1.1 使用 JQuery 的复杂性问题1.2 VUE 简介1.2.1 前端框架1.2.2 MVVM 二、 vue 入门使用2.1 vue 的引入2.2 入门案…...
uniapp实战 —— 骨架屏
1. 自动生成骨架屏代码 在微信开发者工具中,预览界面点击生成骨架屏 确定后,会自动打开骨架屏代码文件 pages\index\index.skeleton.wxml 2. 将骨架屏代码转换为vue文件 在项目中新建文件 src\pages\index\components\skeleton.vue 将pages\index\index…...
【数据仓库-10】-- 数据仓库、数据湖和湖仓一体对比
目录 1 数据仓库与数据库的对比 2 数据湖与数据仓库的对比 3 数据仓库、数据湖和湖仓一体...
单臂路由与三层交换机
单臂路由 划分VLAN后同一VLAN的计算机属于同一个广播域,同一VLAN的计算机之间的通信是不成问题的。然而,处于不同VLAN的计算机即使是在同一交换机上,它们之间的通信也必须使用路由器。 图(a)是一种实现VLAN间路由的方…...
免费的数据采集软件,最新免费的几款数据采集软件【2024】
在当今数字化时代,数据是企业决策和业务发展的关键。而如何高效获取数据成为许多企业和研究机构的关注焦点。本文将深入探讨数据采集软件的种类。帮助大家选择最适合自己需求的数据采集工具。 数据采集软件种类 在众多数据采集软件中,有一类强大而多样…...
nodejs微信小程序+python+PHP北京地铁票务APP-计算机毕业设计推荐 -安卓
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...
zabbix 进阶
zabbix的字段发现机制: zabbix客户端主动和服务端联系,将自己的地址和端口发送服务端实现字段添加监控主机。 客户端是主动一方。 缺点:自定义网段中主机数量太多,登记耗时会很久,而且这个自动发现机制不是很稳定。…...
【性能测试】Jmeter 配置元件(一):计数器
Jmeter 配置元件(一):计数器 在 Jmeter 中,通过函数 ${__counter(,)} 可以实现每次加 1 1 1 的计数效果。但如果步长不为 1 1 1,则要利用到我们的计数器。 函数作用${__counter(,)}计数器,每次加 1${__d…...
使用Dockerfile Maven Plugin 将Docker镜像Push到AWS ECR (Elastic Container Registry)
文章目录 小结问题解决AWS ECR (Elastic Container Registry)的登录问题 pull access denied for jdk, repository does not exist问题 Could not acquire image ID or digest following builddockerfile-maven-plugin 使用 参考 小结 本文记录使用Dockerfile Maven Plugin 将…...
Qt6.10.1 + QCustomPlot 2.1.1 串口绘图实战:从Qt5老项目迁移到新版本的完整踩坑记录
Qt6.10.1与QCustomPlot 2.1.1串口绘图项目迁移实战指南 当Qt5项目需要升级到Qt6时,许多开发者都会面临兼容性挑战。特别是那些涉及串口通信和数据可视化的项目,往往隐藏着不少"坑"。本文将带你完整走一遍从Qt5老项目迁移到Qt6.10.1的全过程&am…...
2269 上市公司智慧供应链对数字创新的平均处理效应指标【ATT】(2000-2024)
数据来源上市公司年报时间跨度2000-2024区域跨度全国所有上市公司数据格式数据格式为Excel形式数据简介本数据集旨在全面测度中国上市公司智慧供应链建设的政策冲击效应,涵盖了2000年至2024年A股上市公司的长周期面板数据。作为研究数字经济与实体经济深度融合的关键…...
利用kimi与快马平台,十分钟搭建个人博客web应用原型
最近想快速验证一个个人博客的创意,但自己从头写代码太费时间。尝试用InsCode(快马)平台的Kimi模型生成原型,没想到十分钟就搞定了可运行的Web应用,分享下这个高效流程: 明确需求梳理结构 先花2分钟在纸上画了博客的基本框架&…...
PaddleX印章识别实战:5分钟搞定Seal-Recognition模型部署(附避坑指南)
PaddleX印章识别实战:从零部署到高效应用的完整指南 印章识别在合同审核、公文归档等场景中需求旺盛,但传统方案往往面临部署复杂、适配困难等问题。PaddleX推出的Seal-Recognition模型通过预训练产线低代码API的方式,让中小团队也能快速获得…...
PP-DocLayoutV3部署教程:requirements.txt依赖版本兼容性验证指南
PP-DocLayoutV3部署教程:requirements.txt依赖版本兼容性验证指南 1. 引言:为什么需要关注依赖兼容性 当你准备部署PP-DocLayoutV3这个强大的文档布局分析模型时,可能会遇到一个常见但令人头疼的问题:明明按照文档安装了所有依赖…...
3个核心功能让视频创作者轻松提取硬字幕
3个核心功能让视频创作者轻松提取硬字幕 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内容提取。A GUI tool for ex…...
从零部署到实战标注:SUSTechPOINTS 3D点云标注平台全流程指南
1. 为什么选择SUSTechPOINTS进行3D点云标注 在自动驾驶研发过程中,3D点云标注是个绕不开的苦差事。我最早用过不少商业标注工具,不是价格贵得离谱,就是功能残缺不全。直到去年团队接手一个校企合作项目,才发现南方科技大学开源的这…...
新手如何借助快马平台AI生成代码,轻松入门蓝桥杯经典题型
作为一个刚接触编程的新手,参加蓝桥杯这样的比赛可能会觉得无从下手。特别是看到题目要求实现算法时,往往不知道如何把问题拆解成代码。最近我发现用InsCode(快马)平台可以很好地解决这个问题,它能根据题目描述直接生成可运行的代码ÿ…...
DeerFlow效果展示:自动生成的深度研究报告与播客内容惊艳分享
DeerFlow效果展示:自动生成的深度研究报告与播客内容惊艳分享 1. DeerFlow核心能力概览 DeerFlow作为一款深度研究智能助手,整合了语言模型、网络搜索和代码执行能力,能够自动完成从信息收集到内容生成的全流程工作。其核心功能亮点包括&am…...
开源可部署!PyTorch 2.8 RTX 4090D镜像在企业AIGC生产环境落地实践
开源可部署!PyTorch 2.8 RTX 4090D镜像在企业AIGC生产环境落地实践 1. 为什么选择这个深度学习镜像 在当今AI技术快速发展的背景下,企业面临的最大挑战之一是如何快速搭建稳定高效的AI开发环境。传统方式需要手动配置CUDA、PyTorch和各种依赖库&#x…...
