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

组合模式 - 组合模式的实现

引言

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,从而简化了代码的复杂性。本文将详细介绍如何在C++中实现组合模式,并通过示例代码帮助读者理解其工作原理。

组合模式的基本概念

组合模式的核心思想是将对象组织成树形结构,其中每个节点可以是单个对象(叶子节点)或组合对象(容器节点)。组合对象可以包含其他组合对象或叶子对象,从而形成递归结构。

组合模式的角色

  1. Component(抽象组件):定义所有组件的通用接口,包括叶子节点和组合节点。它通常包含一些默认行为或属性。
  2. Leaf(叶子节点):表示树形结构中的叶子节点,它没有子节点。
  3. Composite(组合节点):表示树形结构中的组合节点,它可以包含子节点(叶子节点或其他组合节点)。

C++实现组合模式

1. 定义抽象组件类

首先,我们定义一个抽象组件类 Component,它包含所有组件的通用接口。

#include <iostream>
#include <vector>
#include <memory>// 抽象组件类
class Component {
public:virtual ~Component() = default;virtual void operation() const = 0;virtual void add(std::shared_ptr<Component> component) {}virtual void remove(std::shared_ptr<Component> component) {}virtual std::shared_ptr<Component> getChild(int index) { return nullptr; }
};

2. 定义叶子节点类

接下来,我们定义一个叶子节点类 Leaf,它继承自 Component 并实现 operation 方法。

// 叶子节点类
class Leaf : public Component {
public:void operation() const override {std::cout << "Leaf operation" << std::endl;}
};

3. 定义组合节点类

然后,我们定义一个组合节点类 Composite,它也继承自 Component,并实现 operationaddremove 和 getChild 方法。

// 组合节点类
class Composite : public Component {
public:void operation() const override {std::cout << "Composite operation" << std::endl;for (const auto& child : children_) {child->operation();}}void add(std::shared_ptr<Component> component) override {children_.push_back(component);}void remove(std::shared_ptr<Component> component) override {children_.erase(std::remove(children_.begin(), children_.end(), component), children_.end());}std::shared_ptr<Component> getChild(int index) override {if (index < 0 || index >= children_.size()) {return nullptr;}return children_[index];}private:std::vector<std::shared_ptr<Component>> children_;
};

4. 使用组合模式

最后,我们通过一个简单的示例来演示如何使用组合模式。

int main() {// 创建叶子节点auto leaf1 = std::make_shared<Leaf>();auto leaf2 = std::make_shared<Leaf>();// 创建组合节点auto composite1 = std::make_shared<Composite>();composite1->add(leaf1);composite1->add(leaf2);// 创建另一个组合节点auto composite2 = std::make_shared<Composite>();composite2->add(composite1);// 执行操作composite2->operation();return 0;
}

5. 运行结果

运行上述代码,输出结果如下:

Composite operation
Composite operation
Leaf operation
Leaf operation

总结

组合模式通过将对象组织成树形结构,使得客户端可以统一处理单个对象和组合对象。这种模式在处理递归结构时非常有用,尤其是在需要表示“部分-整体”层次结构的场景中。通过本文的示例代码,读者可以更好地理解如何在C++中实现组合模式,并将其应用到实际项目中。

希望本文对你理解组合模式有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。

相关文章:

组合模式 - 组合模式的实现

引言 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象&#xff0c;从而简化了代码的复杂性。本文将详细介绍如何在C中实…...

视频外绘技术总结:Be-Your-Outpainter、Follow-Your-Canvas、M3DDM

Diffusion Models专栏文章汇总:入门与实战 前言:视频Inpaint的技术很火,但是OutPaint却热度不高,这篇博客总结比较经典的几篇视频Outpaint技术。其实Outpaint在runway等工具上很火,可是学术界对此关注比较少,博主从这三年的顶会中找到了最具代表性的三篇论文解读。 目录 …...

【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1QPSK 2.2 帧同步 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章 《基于FPGA的QPSK帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可…...

c++面试:类定义为什么可以放到头文件中

这个问题是刚了解预编译的时候产生的疑惑。 声明是指向编译器告知某个变量、函数或类的存在及其类型&#xff0c;但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。定义不仅告诉编译器实体的存在&#xff0c;还会为该实体分配存储空间&#…...

PythonFlask框架

文章目录 处理 Get 请求处理 POST 请求应用 app.route(/tpost, methods[POST]) def testp():json_data request.get_json()if json_data:username json_data.get(username)age json_data.get(age)return jsonify({username: username测试,age: age})从 flask 中导入了 Flask…...

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下&#xff0c;你是个 Kotlin 开发者&#xff0c;敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很&#xff1f;别急&#xff0c;Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode&#xff0c;直接省时省力&#xff01;再想想需要多种状…...

冬天适合养什么鱼?

各位鱼友们&#xff0c;冬天来了&#xff0c;是不是还在为养什么鱼而烦恼&#xff1f;别担心&#xff0c;今天就来给大家好好推荐一些适合冬天养的鱼&#xff0c;让你的水族箱在寒冷的冬天也能生机勃勃&#xff01; 一、金鱼&#xff1a;冬日里的“小暖男” 金鱼绝对是冬季养鱼…...

【C++动态规划 状态压缩】2597. 美丽子集的数目|2033

本文涉及知识点 C动态规划 LeetCode2597. 美丽子集的数目 给你一个由正整数组成的数组 nums 和一个 正 整数 k 。 如果 nums 的子集中&#xff0c;任意两个整数的绝对差均不等于 k &#xff0c;则认为该子数组是一个 美丽 子集。 返回数组 nums 中 非空 且 美丽 的子集数目。…...

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…...

20【变量的深度理解】

一说起变量&#xff0c;懂点编程的都知道&#xff0c;但是在理解上可能还不够深 变量就是存储空间&#xff0c;电脑上的存储空间有永久&#xff08;硬盘&#xff09;和临时&#xff08;内存条&#xff09;两种&#xff0c;永久数据重启电脑后依旧存在&#xff0c;临时数据只…...

大数据学习之Kafka消息队列、Spark分布式计算框架一

Kafka消息队列 章节一.kafka入门 4.kafka入门_消息队列两种模式 5.kafka入门_架构相关名词 Kafka 入门 _ 架构相关名词 事件 记录了世界或您的业务中 “ 发生了某事 ” 的事实。在文档中 也称为记录或消息。当您向 Kafka 读取或写入数据时&#xff0c;您以事件的 形式执行…...

基于Flask的旅游系统的设计与实现

【Flask】基于Flask的旅游系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为后端开发语言&#xff0c;结合前端Bootstrap框架&#xff0c;为用户提供了丰富…...

“AI视频智能分析系统:让每一帧视频都充满智慧

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个特别厉害的东西——AI视频智能分析系统。想象一下&#xff0c;如果你有一个超级聪明的“视频助手”&#xff0c;它不仅能自动识别视频中的各种元素&#xff0c;还能根据内容生成详细的分析报告&#xff0c;是不是感觉特别酷…...

算法随笔_31:移动零

上一篇:算法随笔_30: 去除重复字母-CSDN博客 题目描述如下: 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,…...

改进候鸟优化算法之二:基于混沌映射的候鸟优化算法(MBO-CM)

基于混沌映射的候鸟优化算法(Migrating Birds Optimization based on Chaotic Mapping,MBO-CM)是一种结合了混沌映射与候鸟优化算法(Migrating Birds Optimization,MBO)的优化方法。 一、候鸟优化算法(MBO)简介 候鸟优化算法是一种自然启发的元启发式算法,由Duman等人…...

在Docker 容器中安装 Oracle 19c

在 Docker 容器中安装 Oracle 19c 是可行的&#xff0c;但它相较于其他数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;会复杂一些&#xff0c;因为 Oracle 数据库有一些特定的要求&#xff0c;如操作系统和库的依赖&#xff0c;以及许可证问题。 不过&#xff0c;Ora…...

使用Avalonia UI实现DataGrid

1.Avalonia中的DataGrid的使用 DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中&#xff0c;DataGrid 是一个独立的包 Avalonia.Controls.DataGrid&#xff0c;因此需要单独通过 NuGet 安装。接下来&#xff0c;将介绍如何安装和使用 DataGrid 控件。 2.安装 Dat…...

MySQL中的读锁与写锁:概念与作用深度剖析

MySQL中的读锁与写锁&#xff1a;概念与作用深度剖析 在MySQL数据库的并发控制机制中&#xff0c;读锁和写锁起着至关重要的作用。它们是确保数据在多用户环境下能够正确、安全地被访问和修改的关键工具。 一、读锁&#xff08;共享锁&#xff09;概念 读锁&#xff0c;也称为…...

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)

大家好&#xff0c;今天是Dest1ny漏洞库的专题&#xff01;&#xff01; 会时不时发送新的漏洞资讯&#xff01;&#xff01; 大家多多关注&#xff0c;多多点赞&#xff01;&#xff01;&#xff01; 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚…...

python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算

【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。 按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位异或运算&#xff1a; 两个等长度二进制数上下对齐&#xff0c;相…...

Kaggle Notebook中文乱码终结者:3分钟搞定Matplotlib字体配置(附Noto Sans CJK全流程)

Kaggle Notebook中文乱码终结者&#xff1a;3分钟搞定Matplotlib字体配置&#xff08;附Noto Sans CJK全流程&#xff09; 在数据可视化过程中&#xff0c;中文显示问题一直是困扰许多Kaggle用户的痛点。当你在Notebook中满怀期待地运行代码&#xff0c;却发现图表中的中文变成…...

Keil工程管理效率翻倍:Python脚本实现构建结果自动归档与HTML报告生成

Keil工程管理效率翻倍&#xff1a;Python脚本实现构建结果自动归档与HTML报告生成 在嵌入式开发领域&#xff0c;Keil作为主流开发工具链的核心组件&#xff0c;其工程管理效率直接影响着团队协作和产品迭代速度。传统开发流程中&#xff0c;工程师往往需要手动收集每次构建生成…...

告别吃灰!用Kindle打造唐诗宋词字帖屏保的完整避坑指南(含繁简转换技巧)

用Kindle打造唐诗宋词字帖屏保的完整指南 作为一个长期关注数字阅读与传统文化的深度用户&#xff0c;我发现Kindle的墨水屏特性非常适合展示书法字帖。这种将现代科技与传统艺术结合的方式&#xff0c;不仅能提升设备使用率&#xff0c;还能在日常碎片时间中培养书写习惯。本文…...

CSS图片轮播进阶:5种实现无限循环滚动的实战技巧(附完整代码)

CSS图片轮播进阶&#xff1a;5种实现无限循环滚动的实战技巧&#xff08;附完整代码&#xff09; 在电商网站的首页或个人作品集的展示页面中&#xff0c;图片轮播&#xff08;Carousel&#xff09;始终是吸引用户注意力的利器。而无限循环滚动效果&#xff0c;则能让有限的展示…...

RK3588嵌入式Linux开发实战:uboot任意键中断autoboot功能实现

1. 为什么需要任意键中断autoboot功能 在嵌入式Linux开发中&#xff0c;uboot作为系统启动的"引路人"&#xff0c;承担着硬件初始化、内核加载等重要任务。RK3588这类高性能处理器在启动时&#xff0c;默认会进入autoboot倒计时流程。这个设计本意是好的——当系统正…...

SecGPT-14B部署教程:适配国产昇腾910B的vLLM分支编译与性能调优

SecGPT-14B部署教程&#xff1a;适配国产昇腾910B的vLLM分支编译与性能调优 1. SecGPT-14B简介 SecGPT是由云起无垠推出的开源大语言模型&#xff0c;专注于网络安全领域。该模型融合了自然语言理解、代码生成和安全知识推理等能力&#xff0c;旨在为安全专业人员提供智能辅助…...

QEMU监视器隐藏玩法:用TCP端口转发实现远程调试(2024最新版)

QEMU监视器隐藏玩法&#xff1a;用TCP端口转发实现远程调试&#xff08;2024最新版&#xff09; 在边缘计算和物联网设备调试中&#xff0c;经常需要跨越物理距离管理虚拟机。传统方式要求开发者必须物理接触设备或依赖图形界面&#xff0c;这在分布式场景中显得笨拙且低效。实…...

遥感智能解译新纪元:GeoSeg破解地物识别效率瓶颈的技术革新

遥感智能解译新纪元&#xff1a;GeoSeg破解地物识别效率瓶颈的技术革新 【免费下载链接】GeoSeg UNetFormer: A UNet-like transformer for efficient semantic segmentation of remote sensing urban scene imagery, ISPRS. Also, including other vision transformers and CN…...

汽车线控转向系统动力学法Carsim和Simulink联合仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

逆向工程必备:用aardio和Sunny中间件抓取手机App封包的3种实战姿势

逆向工程实战&#xff1a;aardio与Sunny中间件的移动端封包拦截艺术 在移动应用安全研究领域&#xff0c;封包拦截与分析是理解应用通信逻辑的关键入口。不同于传统的PC端抓包&#xff0c;移动环境面临着证书绑定、代理检测等更复杂的防御机制。aardio配合Sunny中间件构建的轻量…...