用Rust实现23种设计模式之桥接模式
桥接模式的优点:
桥接模式的设计目标是将抽象部分和实现部分分离,使它们可以独立变化。这种分离有以下几个优点:
- 解耦和灵活性:桥接模式可以将抽象部分和实现部分解耦,使它们可以独立地变化。这样,对于抽象部分的修改不会影响到实现部分,反之亦然。这种解耦和灵活性使得系统更加灵活,易于扩展和维护。
- 可扩展性:桥接模式通过将抽象部分和实现部分分离,使得可以独立地扩展抽象部分和实现部分。可以通过添加新的抽象部分或实现部分来扩展系统功能,而不会影响到其他部分的代码。
- 可复用性:桥接模式可以提高代码的可复用性。通过将抽象部分和实现部分分离,可以在不同的组合下重用抽象部分和实现部分,从而避免了代码的重复编写。
- 隐藏细节:桥接模式可以隐藏实现的细节,使得客户端只需要关注抽象部分的接口。这样可以降低客户端的复杂性,同时也可以保护实现的细节不被暴露出来。
Rust实现桥接模式的代码示例:
// 定义实现类接口
trait Implementor {fn operation_impl(&self);
}// 实现具体的实现类
struct ConcreteImplementorA;
impl Implementor for ConcreteImplementorA {fn operation_impl(&self) {println!("ConcreteImplementorA operation");}
}struct ConcreteImplementorB;
impl Implementor for ConcreteImplementorB {fn operation_impl(&self) {println!("ConcreteImplementorB operation");}
}// 定义抽象类接口
trait Abstraction {fn operation(&self);
}// 实现具体的抽象类
struct RefinedAbstraction {implementor: Box<dyn Implementor>,
}
impl RefinedAbstraction {fn new(implementor: Box<dyn Implementor>) -> Self {RefinedAbstraction { implementor }}
}
impl Abstraction for RefinedAbstraction {fn operation(&self) {self.implementor.operation_impl();}
}fn main() {// 创建具体的实现类对象let implementor_a: Box<dyn Implementor> = Box::new(ConcreteImplementorA);let implementor_b: Box<dyn Implementor> = Box::new(ConcreteImplementorB);// 创建具体的抽象类对象,并将实现类对象传入let abstraction_a = RefinedAbstraction::new(implementor_a);let abstraction_b = RefinedAbstraction::new(implementor_b);// 调用抽象类的操作方法abstraction_a.operation();abstraction_b.operation();
}
代码说明:
在上述代码中,我们首先定义了实现类接口 Implementor ,并实现了两个具体的实现类 ConcreteImplementorA 和 ConcreteImplementorB 。这些具体实现类分别实现了 Implementor 接口的 operation_impl 方法。
然后,我们定义了抽象类接口 Abstraction ,并实现了具体的抽象类 RefinedAbstraction 。这个具体抽象类包含一个实现类对象,并在 operation 方法中调用实现类的 operation_impl 方法。
在 main 函数中,我们创建了具体的实现类对象 implementor_a 和 implementor_b 。然后,我们创建了具体的抽象类对象 abstraction_a 和 abstraction_b ,并将相应的实现类对象传入。最后,我们调用抽象类的 operation 方法,实际上调用了相应实现类的 operation_impl 方法。
通过桥接模式,我们可以将抽象部分和实现部分分离,使它们可以独立变化。这样可以提高系统的灵活性、可扩展性和可复用性,并隐藏实现的细节。
相关文章:
用Rust实现23种设计模式之桥接模式
桥接模式的优点: 桥接模式的设计目标是将抽象部分和实现部分分离,使它们可以独立变化。这种分离有以下几个优点: 解耦和灵活性:桥接模式可以将抽象部分和实现部分解耦,使它们可以独立地变化。这样,对于抽象…...
扩散模型实战(一):基本原理介绍
扩散模型(Diffusion Model)是⼀类⼗分先进的基于物理热⼒学中的扩散思想的深度学习⽣成模型,主要包括前向扩散和反向扩散两个过程。⽣成模型除了扩散模型之外,还有出现较早的VAE(Variational Auto-Encoder,…...
解决npm ERR! code ERESOLVE -npm ERR! ERESOLVE could not resolve
当使用一份vue源码开发项目时,npm install 报错了 npm ERR! code ERESOLVEnpm ERR! ERESOLVE could not resolvenpm ERR!npm ERR! While resolving: vue-admin-template4.4.0npm ERR! Found: webpack4.46.0npm ERR! node_modules/webpacknpm ERR! webpack"^4.0…...
HttpServletRequest和HttpServletResponse的获取与使用
相关笔记:【JavaWeb之Servlet】 文章目录 1、Servlet复习2、HttpServletRequest的使用3、HttpServletResponse的使用4、获取HttpServletRequest和HttpServletResponse 1、Servlet复习 Servlet是JavaWeb的三大组件之一: ServletFilter 过滤器Listener 监…...
css在线代码生成器
这里收集了许多有意思的css效果在线代码生成器适合每一位前端开发者 布局,效果类: 网格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可帮助开发人员使用CSS Grid创建复杂的网格布局。网格布局是创建Web页面的灵活和响应式设计的强…...
在java中如何使用openOffice进行格式转换,word,excel,ppt,pdf互相转换
1.首先需要下载并安装openOffice,下载地址为: Apache OpenOffice download | SourceForge.net 2.安装后,可以测试下是否可用; 3.build.gradle中引入依赖: implementation group: com.artofsolving, name: jodconverter, version:…...
手机变电脑2023之虚拟电脑droidvm
手机这么大的内存,装个app来模拟linux,还是没问题的。 app 装好后,手指点几下确定按钮,等几分钟就能把linux桌面环境安装好。 不需要敲指令, 不需要对手机刷机, 不需要特殊权限, 不需要找驱…...
HDFS中的sequence file
sequence file序列化文件 介绍优缺点格式未压缩格式基于record压缩格式基于block压缩格式 介绍 sequence file是hadoop提供的一种二进制文件存储格式一条数据称之为record(记录),底层直接以<key, value>键值对形式序列化到文件中 优…...
【MySQL】检索数据使用数据处理函数
函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。 函数没有SQL的可移植性强:能运行在多个系统上的代码称为可移植的。多数SQL语句是可移植的,而函数的可…...
【嵌入式学习笔记】嵌入式入门6——定时器TIMER
1.定时器概述 1.1.软件定时原理 使用纯软件(CPU死等)的方式实现定时(延时)功能有诸多缺点,如CPU死等、延时不精准。 void delay_us(uint32_t us) {us * 72;while(us--); }1.2.定时器定时原理 使用精准的时基&#…...
GD32F103输入捕获
GD32F103输入捕获程序,经过多次测试,终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚,捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮,第1次按下采集一个值保存到TIMER2_CountValue1中,第2次按下采集一个值保存到TIM…...
[RT-Thread]基于ARTPI的文件系统认识与搭建
[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文] 目录 [写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文] 前提 内容 认识 基于ARTPI的文件系统的挂载 ROMFS与LFS. (默认自动挂载,romfs可读不可写) 搭…...
动态规划+二分查找
题目描述:给定一个区间数组,[[1,2,3],[3,4,2],[2,4,4]],每个区间有价值,求在获取k个区间的条件下面,求获得的最大的价值,关键是dp的定义和二分查找的写法(小于tar额最右下标) import…...
8.2小非农ADP数据来袭黄金将会如何表现?
近期有哪些消息面影响黄金走势?黄金多空该如何研判? 黄金消息面解析: 周二(8月1日)现货黄金价格回落,原因是美元指数升创7月10日以来新高至102.43.美联储官员乐观言论夯实美国经济软着陆预期。此外,中国刺激措施将…...
linux启动oracle
一、启动方法 方法1: Sql代码 cd $ORACLE_HOME/bin #进入到oracle的安装目录 ./dbstart #重启服务器 ./lsnrctl start #重启监听器 ----------------------------------- 方法2: (1) 以oracle身份登录数据库&am…...
AssetBundleBrowser导入报错解决方案
第一次导入AssetBundleBrowser遇到报错有 Assets\Scenes\AssetBundles-Browser-master\AssetBundles-Browser-master\Tests\Editor\ABModelTests.cs(13,7): error CS0246: The type or namespace name Boo could not be found (are you missing a using directive or an assem…...
vue-baidu-map-3x 使用记录
在 Vue3 TypeScript 项目中,为了采用 标签组件 的方式,使用百度地图组件,冲浪发现了一个开源库 ovo,很方便!喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本(支持v2.0、v…...
《GPU并行计算与CUDA编程》笔记
第一个GPU程序 #include <stdio.h>__global__ void square(float* d_out,float* d_in){int idx threadIdx.x;float f d_in[idx];d_out[idx] f * f; }int main(int argc,char** argv){const int ARRAY_SIZE 8;const int ARRAY_BYTES ARRAY_SIZE * sizeof(float);// …...
Shell编程基础(十二)函数
函数 概念定义调用函数综合脚本 概念 和其他编程语言一样,函数作为一种封装代码块,以提高代码复用性和可维护性的存在。 记住一点,先定义,再使用 定义 shell 函数的创建方式 function 函数名 空格{ xxxx return 返回码&#x…...
【雕爷学编程】MicroPython动手做(33)——物联网之天气预报3
天气(自然现象) 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象,即某瞬时内大气中各种气象要素(如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等ÿ…...
煤矸石自动分离机设计【论文+CAD图纸】
煤矸石作为煤炭开采与洗选过程中产生的固体废弃物,其成分复杂、粒度分布不均,传统人工分选效率低且精度难以保证。煤矸石自动分离机的设计以机械结构优化与物料特性分析为核心,通过多级筛分与智能识别技术的结合,实现煤矸石与煤炭…...
glm-5-free不输付费版!DMXAPIAI模型聚合平台,如何调用免费大模型API?
中关村论坛发布AutoGLM 沉思智能体,具备深度研究与电脑操作双重能力,GLM-5.1 编程能力与全球顶尖模型 Claude Opus 4.6 差距仅2.6 分,整体呈现技术迭代、商业化与资本市场的全面提速态势。智谱AI正式推出GLM-5-free开源模型,凭借与…...
【无标题】作业
案例1:软件233班学生信息数据分析与可视化一、数据预处理首先读取Excel文件,处理缺失值。原始数据中存在大量空值(生源省份、城市、生日、寝室号、成绩等),需进行清洗: 性别:仅“男”“女”&…...
Claude Sonnet/Opus 4.6、CodeX系列、Gemini系列三大国际顶级模型到底有多强?!不服真不行!
Claude 4.6 系列、GPT-5.3 Codex 和 Gemini 3 Pro 三分天下: 维度Claude 4.6 (Sonnet/Opus)GPT-5.3 CodexGemini 3.1 Pro逻辑推理 (GPQA)Opus: 91.3% (巅峰)90.2%89.5%代码工程 (SWE-bench)Sonnet: 79.6% (最稳)56.8% (Pro 版)54.2%终端执行 (Terminal-Bench)69.9%…...
嵌入式软件架构设计:基础设施层实践指南
1. 嵌入式软件架构设计概述作为一名在嵌入式领域摸爬滚打多年的工程师,我深知软件架构设计的重要性。很多人认为架构设计是资深工程师的专利,其实不然。就像盖房子需要先打地基一样,任何规模的嵌入式项目都需要合理的架构设计作为基础。嵌入式…...
Go语言的并发编程:从Goroutine到Channel
Go语言的并发编程:从Goroutine到Channel 并发编程的重要性 在现代软件开发中,并发编程已经成为一种必要的技能。随着多核处理器的普及,充分利用系统资源,提高程序的执行效率,已经成为开发者的重要目标。并发编程可以&a…...
DBSCAN vs K-means:5个真实数据集对比,教你选对聚类算法
DBSCAN与K-means实战对比:5个真实数据集下的算法选择指南 第一次接触聚类分析时,我被一个简单问题困扰:为什么同样的数据用不同算法会得到截然不同的分组结果?记得当时用K-means处理地理坐标数据,结果把绵延的海岸线硬…...
企业AI应用开发:从零构建企业级AI智能体的全流程指南
一文讲透智能体开发的核心要素,让AI真正融入业务系统随着大模型技术的成熟,AI智能体正从概念走向企业核心业务。对于信息中心和软件开发团队而言,如何低成本、高效率地将AI能力嵌入业务流程,已成为技术选型的核心考量。本文将系统…...
研究表明:员工不懂AI使用方法,企业难辞其咎
员工对AI工具使用方法缺乏了解,这与企业在试点项目、部署和许可证上投入多少资金无关,Forrester的最新研究显示了这一问题。Forrester使用人工智能商数(AIQ)来衡量员工对AI工具的理解程度,结果数据"令人震惊"…...
Linux内核设计哲学:你我承载力的艺术(续)
第七部:设备驱动——与不完美的世界和解7.1 你不是主人,你是仆人设备驱动是内核中最“卑微”的组件。它不和用户直接打交道,不参与核心决策,甚至不拥有任何资源。它只是硬件的翻译官——把内核的标准请求翻译成硬件能懂的指令&…...
