用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 方法来执行整个组合结构的操作。
通过组合模式,我们可以将对象组合成树状结构,以统一的方式处理单个对象和组合对象,提高代码的灵活性和可扩展性。

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

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

相关文章

Java课题笔记~ 不使用 AOP 的开发方式(理解)

Step1&#xff1a;项目 aop_leadin1 先定义好接口与一个实现类&#xff0c;该实现类中除了要实现接口中的方法外&#xff0c;还要再写两个非业务方法。非业务方法也称为交叉业务逻辑&#xff1a; doTransaction()&#xff1a;用于事务处理 doLog()&#xff1a;用于日志处理 …

sql 关联了2张表的 update 语句(转)

转自&#xff1a;SQL Update&#xff1a;使用一个表的数据更新另一张表 、update 关联两个表 基本上 select 能支持的关联和子查询操作&#xff0c;都能在 update 语句中使用。 在 where 条件中使用子查询 update a set a.age 1 where id in (select device_id from b) 在 wher…

42.利用 牛顿迭代法解非线性高维方程组(matlab程序)

1.简述 若向量记号为X,方程组就可以写成F(X)0的形式。 我们知道&#xff0c;对于一元函数的牛顿迭代法求根公式 类似的&#xff0c;对于多元函数求根公式 其中X是向量&#xff0c;是非线性方程组对应的雅可比矩阵。 具体求解的时候&#xff0c;我们可以先通过绘图命令绘制图形…

Selenium 根据元素文本内容定位

使用xpath定位元素时&#xff0c;有时候担心元素位置会变&#xff0c;可以考虑使用文本内容来定位的方式。 例如图中的【股市】按钮&#xff0c;只有按钮文本没变&#xff0c;即使位置变化也可以定位到该元素。 xpath内容样例&#xff1a; # 文本内容完全匹配 //button[text(…

Python2.x 与 3​​.x 版本区别

Python2.x 与 3​​.x 版本区别 Python 的 3​​.0 版本&#xff0c;常被称为 Python 3000&#xff0c;或简称 Py3k。相对于 Python 的早期版本&#xff0c;这是一个较大的升级。 为了不带入过多的累赘&#xff0c;Python 3.0 在设计的时候没有考虑向下相容。 许多针对早期 …

刷题笔记 day9

1658 将 x 减到 0 的最小操作数 解析&#xff1a;1. 当数组的两端的数都大于x时&#xff0c;直接返回 -1。 2. 当数组所有数之和小于 x 时 &#xff0c;直接返回 -1。 3. 数组中可以将 x 消除为0&#xff0c;那么可以从左边减小为 0 &#xff1b;可以从右边减小为 0 &#xff1…

10大在线头脑风暴工具,团队创新必备!

在线头脑风暴工具的使用为创意发展和团队协作提供了许多优势&#xff0c;使团队成员能够同时参与头脑风暴&#xff0c;促进创意的产生和交流。一款优秀的在线头脑风暴工具可以以直观的方式展示创意&#xff0c;激发创造力和想象力。此外&#xff0c;还具有组织和整理功能&#…

linux文本三剑客---grep,sed,awk

目录 grep 什么是grep&#xff1f; grep实例演示 命令参数&#xff1a; 案例演示&#xff1a; sed 概念&#xff1a; 常用选项&#xff1a; 案例演示&#xff1a; awk 概念&#xff1a; awk常用命令选项&#xff1a; awk变量&#xff1a; 内置变量 自定义变量 a…

npm install报错 -> npm ERR! Unexpected token ‘.‘ 报错解决办法。

问题原因&#xff1a; 用nvm1.1.7的版本安装了16.x以上的node, 然后再下载依赖的时候就报错了&#xff1b;总结一下就是nvm版本太低了&#xff0c;他的里面没有集成高版本node导致的。 解决办法&#xff1a; 把nvm切换到新版本就行了。 1. 卸载掉当前所有的node nvm unins…

Cadence学习

Cadence学习 Cadence内容涵盖Cadence主要功能Cadence功能模块Allegro Design Entry CIS 和 OrCAD Capture CIS 的区别Cadence 公司简介Allegro Design Entry CISOrCAD Capture CIS OrCAD中part和database part区别OrCAD中不同页面的连接关系应该怎么处理&#xff08;1&#xff…

MacBook安装Navicat Premium与注册

MacBook安装Navicat Premium与注册 参照下面的链接安装成功 https://www.52pojie.cn/forum.php?modviewthread&tid692132 https://blog.csdn.net/xhd731568849/article/details/79751188 https://blog.csdn.net/u013490280/article/details/79720893 https://blog.csdn.n…

基于Mediapipe的姿势识别并同步到Unity人体模型中

如题&#xff0c;由于是商业项目&#xff0c;无法公开源码&#xff0c;这里主要说一下实现此功能的思路。 人体关节点识别 基于Mediapipe Unity插件进行开发&#xff0c;性能比较低的CPU主机&#xff0c;无法流畅地运行Mediapipe&#xff0c;这个要注意一下。 Mediapipe33个人体…

初始化前端项目配置 eslint、prettier、husky 等等

每次新项目都要重新配置一遍&#xff0c;有点麻烦&#xff0c;记录一下。 一、配置 ESLint 1.1 核心配置 执行 npm init eslint/config 命令进行初始化&#xff0c;根据提示一路下一步即可&#xff0c;完成后会自动生成 eslintrc 文件并安装相关依赖。 1.2 React 编译模式配…

neo4j入门实例介绍

使用Cypher查询语言创建了一个图数据库&#xff0c;其中包含了电影《The Matrix》和演员Keanu Reeves、Carrie-Anne Moss、Laurence Fishburne、Hugo Weaving以及导演Lilly Wachowski和Lana Wachowski之间的关系。 CREATE (TheMatrix:Movie {title:The Matrix, released:1999,…

java文件

一.File类 二.扫描指定目录&#xff0c;并找到名称中包含指定字符的所有普通文件&#xff08;不包含目录&#xff09;&#xff0c;并且后续询问用户是否要删除该文件 我的代码: import java.io.File; import java.io.IOException; import java.util.Scanner;public class Tes…

简单认识ELK日志分析系统

一. ELK日志分析系统概述 1.ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 好处&#xff1a; &#xff08;1&#xff09;提高安全…

3、JSON数据的处理

3、JSON数据的处理 3.1 介绍 JSON数据 Spark SQL can automatically infer the schema of a JSON dataset and load it as a DataFrame Spark SQL能够自动将JSON数据集以结构化的形式加载为一个DataFrame This conversion can be done using SparkSession.read.json on a JS…

计算机网络—TCP和UDP、输入url之后显示主页过程、TCP三次握手和四次挥手

TCP基本认识 TCP是面向连接的、可靠的&#xff0c;基于字节流的传输层通信协议。 图片来源小林coding 序号&#xff1a;传输方向上字节流的字节编号。初始时序号会被设置一个随机的初始值&#xff08;ISN&#xff09;&#xff0c;之后每次发送数据时&#xff0c;序号值 ISN…

知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例,Neo4j图算法是一套在Neo4j图数据库上运行的算法集合。这些算法专门针对图数据结构进行设计,用于分析、查询和处理图数据。图算法可以帮助我们发现图中的模…

【面试题】 本地运行的前端代码,如何让他人访问?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 有时候&#xff0c;我前端写好了项目&#xff0c;想要给其他人看一下效果&#xff0c;可以选择将代码部署到test环境&#xff0c;也可以选择让外部通过i…