当前位置: 首页 > news >正文

用Rust实现23种设计模式之 组合模式

组合模式是一种结构型设计模式,它允许将对象组合成树状结构,并且能够以统一的方式处理单个对象和组合对象。以下是组合模式的优点和使用场景:

优点:

  1. 简化客户端代码:组合模式通过统一的方式处理单个对象和组合对象,使得客户端无需区分它们,从而简化了客户端代码的复杂性。
  2. 灵活性和可扩展性:由于组合模式使用了树状结构,可以方便地添加、修改和删除对象,从而提供了灵活性和可扩展性。
  3. 统一的操作接口:组合模式定义了统一的操作接口,使得客户端可以一致地对待单个对象和组合对象,从而提高了代码的可读性和可维护性。

使用场景:

  1. 当需要以统一的方式处理单个对象和组合对象时,可以考虑使用组合模式。
  2. 当对象之间存在层次结构,并且需要对整个层次结构进行操作时,可以考虑使用组合模式。
  3. 当希望客户端代码简化且具有灵活性和可扩展性时,可以考虑使用组合模式。

代码示例:

下面是一个使用Rust实现组合模式的示例代码,带有详细的注释和说明:

// 定义组件接口
trait Component {fn operation(&self);
}// 实现叶子组件
struct LeafComponent {name: String,
}impl Component for LeafComponent {fn operation(&self) {println!("LeafComponent: {}", self.name);}
}// 实现容器组件
struct CompositeComponent {name: String,children: Vec<Box<dyn Component>>,
}impl Component for CompositeComponent {fn operation(&self) {println!("CompositeComponent: {}", self.name);for child in &self.children {child.operation();}}
}impl CompositeComponent {fn add(&mut self, component: Box<dyn Component>) {self.children.push(component);}fn remove(&mut self, component: Box<dyn Component>) {self.children.retain(|c| !std::ptr::eq(c.as_ref(), component.as_ref()));}
}fn main() {// 创建叶子组件let leaf1 = Box::new(LeafComponent { name: "Leaf 1".to_string() });let leaf2 = Box::new(LeafComponent { name: "Leaf 2".to_string() });// 创建容器组件let mut composite = Box::new(CompositeComponent { name: "Composite".to_string(), children: vec![] });// 将叶子组件添加到容器组件中composite.add(leaf1);composite.add(leaf2);// 调用容器组件的操作方法composite.operation();
}

代码说明:
在上述代码中,我们首先定义了组件接口 Component ,并实现了叶子组件 LeafComponent 和容器组件 CompositeComponent 。叶子组件表示树中的叶子节点,容器组件表示树中的容器节点,可以包含其他组件。
叶子组件实现了 Component 接口的 operation 方法,用于执行叶子组件的操作。
容器组件实现了 Component 接口的 operation 方法,用于执行容器组件的操作。容器组件还提供了 addremove 方法,用于向容器中添加和删除组件。
main 函数中,我们创建了两个叶子组件 leaf1leaf2 ,以及一个容器组件 composite 。然后,我们将叶子组件添加到容器组件中,并调用容器组件的 operation 方法来执行整个组合结构的操作。
通过组合模式,我们可以将对象组合成树状结构,以统一的方式处理单个对象和组合对象,提高代码的灵活性和可扩展性。

相关文章:

用Rust实现23种设计模式之 组合模式

组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树状结构&#xff0c;并且能够以统一的方式处理单个对象和组合对象。以下是组合模式的优点和使用场景&#xff1a; 优点&#xff1a; 简化客户端代码&#xff1a;组合模式通过统一的方式处理单个对象和组合对象&a…...

opencv36-形态学操作-膨胀 cv2.dilate()

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的&#xff0c;膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象&#xff08;前景&#xff09;接触到的背景点合并到当前对象内&#xff0c;从而实现将图像的边界点向外扩张。如果图像内两个对象的…...

8266 ESP-07模块的使用 以及详细介绍

esp8266系列 陶瓷天线 版本 详细介绍说明 最近使用8266的ESP-01S做了个数据无线收发装置&#xff0c;发现板载天线信号太弱&#xff0c;装上外壳后信号更弱&#xff0c;因此考虑能否使用带有外接天线的模块代替ESP-01S。经过在安可信官网搜索发现&#xff0c;ESP07、ESP07S、ES…...

Linux之 centos、Ubuntu 安装常见程序 (-) Mysql 5.7 版本和8.0版本

CentOS 安装 MySql 注意 需要有root权限 安装5.7版本 – 由于MySql并不在CentOS的官方仓库中&#xff0c;所以需要通过rmp命令&#xff1a; 导入MySQL仓库密钥 1、配置MySQL的yum仓库 配置yum仓库 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 安装…...

【IDEA+Spark Streaming 3.4.1+Dstream监控套接字流统计WordCount保存至MySQL8】

【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】 把DStream写入到MySQL数据库中 Spark 3.4.1MySQL 8.0.30sbt 1.9.2 文章目录 【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】前言一、背景说明二、使用步骤1.引入库2…...

Dcat Admin 入门应用指南

在现代的网络应用开发中&#xff0c;管理后台是不可或缺的一部分。它为开发者提供了一个方便管理和监控应用数据的界面。而 Dcat Admin 是一个强大的管理后台框架&#xff0c;它基于 Laravel 框架开发&#xff0c;提供了丰富的功能和灵活的扩展性。本文将带您深入了解 Dcat Adm…...

计算机视觉:替换万物Inpaint Anything

目录 1 Inpaint Anything介绍 1.1 为什么我们需要Inpaint Anything 1.2 Inpaint Anything工作原理 1.3 Inpaint Anything的功能是什么 1.4 Segment Anything模型&#xff08;SAM&#xff09; 1.5 Inpaint Anything 1.5.1 移除任何物体 1.5.2 填充任意内容 1.5.3 替换任…...

AWS——01篇(AWS入门 以及 AWS之EC2实例及简单实用)

AWS——01篇&#xff08;AWS入门 以及 AWS之EC2实例及简单实用&#xff09; 1. 前言2. 创建AWS账户3. EC23.1 启动 EC2 新实例3.1.1 入口3.1.2 设置名称 选择服务3.1.3 创建密钥对3.1.4 网络设置——安全组3.1.4.1 初始设置3.1.4.2 添加安全组规则&#xff08;开放新端口&…...

Clickhouse 优势与部署

一、clickhouse简介 1.1clickhouse介绍 ClickHouse的背后研发团队是俄罗斯的Yandex公司&#xff0c;2011年在纳斯达克上市&#xff0c;它的核心产品是搜索引擎。我们知道&#xff0c;做搜索引擎的公司营收非常依赖流量和在线广告&#xff0c;所以做搜索引擎的公司一般会并行推…...

全球数据泄露事件增加近三倍

网络安全公司 Surfshark 的最新研究显示&#xff0c;2023 年第二季度共有 1.108 亿个账户遭到泄露&#xff0c;其中美国排名第一&#xff0c;几乎占 4 月至 6 月所有泄露事件的一半。 俄罗斯排名第二&#xff0c;西班牙排名第三&#xff0c;其次是法国和土耳其。 与 2023 年…...

【雕爷学编程】 MicroPython动手做(38)——控制触摸屏2

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…...

钉钉微应用

钉钉微应用 在做钉钉微应用开发的时候&#xff0c;遇到了一些相关性的问题&#xff0c;特此记录下&#xff0c;有遇到其他问题的&#xff0c;欢迎一起讨论 调试工具 当我们基于钉钉开发微应用时&#xff0c;难免会遇到调用钉钉api后的调试&#xff0c;这个时候可以安装eruda…...

【 SpringSecurity】第三方认证方法级别安全

文章目录 SpringSecurity 第三方认证实现方法级别的安全 SpringSecurity 第三方认证 在登录网页时&#xff0c;时常有用其他账号登录的方式&#xff0c;它们能够让用户避免在Web站点特定的登录页上自己输入凭证信息。这样的Web站点提供了一种通过其他网站&#xff08;如Facebo…...

达梦数据库在windows上的安装

前言 简单记录达梦数据库DM7在windows10上的安装过程 1 下载并安装安装包 官网登录后才能下载&#xff0c;建议先注册账户。 下载地址&#xff1a;产品下载-达梦数据 &#xff0c;CPU选择x86&#xff0c;操作系统选择win64即可。解压安装包后&#xff0c;一路安装下去即可。…...

新手Vite打包工具的使用并解决yarn create vite报错

一、手动创建 1.创建vite-Demo文件夹 2.初始化 yarn init -y 3.安装vite yarn add -D vite 4.打包准备 说明&#xff1a;不需要在src下面创建&#xff0c;在vite-Demo文件夹创建 4.1index.js文件 document.body.insertAdjacentHTML("beforeend","<h1>…...

SpringMVC框架——First Day

目录 三层架构 MVC模型 SpringMVC 快速入门案例 SpringMVC的概述&#xff08;了解&#xff09; SpringMVC在三层架构的位置 SpringMVC的优势&#xff08;了解&#xff09; 创建SpringMVC的Maven项目 1.在pom.xml中添加所需要的jar包 2.在工程的web.xml中配置核心Spring…...

基于C++雪花算法工具类Snowflake -来自chatGPT

#include <iostream> #include <chrono> #include <stdexcept>class Snowflake { private:// 雪花算法的各个参数static constexpr int64_t workerIdBits 5;static constexpr int64_t datacenterIdBits 5;static constexpr int64_t sequenceBits 12;stati…...

若依打印sql

官方issue 自动生成的代码&#xff0c;sql日志怎么没有打印 在ruoyi-admin中的application.yml配置如下。 # 日志配置&#xff0c;默认 logging:level:com.ruoyi: debugorg.springframework: warn#添加配置com.ying: debug输出sql...

Camunda BPM Run下载(7.20)

官网地址: https://camunda.com/ 中文站点:http://camunda-cn.shaochenfeng.com https://downloads.camunda.cloud/release/camunda-bpm/run/7.20/https://downloads.camunda.cloud/release/camunda-bpm/run/7.20/camunda-bpm-run-7.20.0-alpha3.ziphttps://downloads.camunda…...

【Ubuntu】Ubuntu 22.04 升级 OpenSSH 9.3p2 修复CVE-2023-38408

升级原因 近日Openssh暴露出一个安全漏洞CVE-2023-38408&#xff0c;以下是相关资讯&#xff1a; 一、漏洞详情 OpenSSH是一个用于安全远程登录和文件传输的开源软件套件。它提供了一系列的客户端和服务器程序&#xff0c;包括 ssh、scp、sftp等&#xff0c;用于在网络上进行…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...