【C++设计模式之组合模式:结构型】分析及示例

简介

组合模式是一种结构型设计模式,它能够将对象组合成树形结构以表示“整体-部分”的层次结构,并且能够使用相同的方式处理单个对象和组合对象。组合模式使得客户端可以一致地处理单个对象和组合对象,无需关心具体的对象类型。

组合模式将对象组织成树型结构,其中树的节点可以是单个对象或者组合对象。通过将对象以树形的方式组合,可以将单个对象和组合对象一视同仁。这种方式使得客户端无需区分单个对象和组合对象,可以递归地处理整个树结构,从而简化了客户端代码。

描述

组合模式涉及以下角色:

  1. 组件(Component):是组合模式中的树节点接口,声明了可以对子节点进行操作的方法,定义了组合对象和叶子对象的共有接口。
  2. 组合(Composite):是组合模式中的非叶子节点类,实现了组件接口,并保存了一个子节点的列表。组合对象可以包含其他组合对象或叶子对象。
  3. 叶子(Leaf):是组合模式中的叶子节点类,实现了组件接口,表示组合对象中的单个对象。

原理

组合模式的原理是将组合对象和叶子对象统一处理,客户端无需区分对待。组合对象中可以包含其他组合对象或叶子对象,这种递归结构可以无限扩展。

类图

在这里插入图片描述

1、Component:组合模式中的“根节点”,可以是接口、抽象类、普通类,该类中定义了其子类的所有共性内容,并且该类中还存在着用于访问和管理它子部件的方法。
2、Leaf:组合中的叶子节点,也就是最末端的节点,该节点下不会再有子节点。
3、Composite:非叶子节点,它的作用是存储子部件,并且在Composite中实现了对子部件的相关操作。

示例

假设有一个文件系统,在文件系统中,有文件夹(组合对象)和文件(叶子对象)。文件夹可以包含其他文件夹或文件,而文件本身不能包含其他对象。可以使用组合模式来处理文件系统中的对象。

在示例中,有三个主要类:

  1. Component(组件):表示组合模式中的树节点,定义了可以对子节点进行操作(如添加、删除、打印等)的接口。
  2. Composite(组合):表示组合模式中的非叶子节点,实现了组件接口,并保存了一个子节点的列表。
  3. Leaf(叶子):表示组合模式中的叶子节点,实现了组件接口,表示组合对象中的单个对象。

C++示例代码:

#include<iostream>
#include<string>
#include<vector>using namespace std;// 组件接口
class Component {
public:virtual void add(Component* component) = 0;virtual void remove(Component* component) = 0;virtual void print() = 0;
};// 组合类
class Composite : public Component {
private:string name;vector<Component*> children;public:Composite(const string& name) : name(name) {}void add(Component* component) override {children.push_back(component);}void remove(Component* component) override {for (auto it = children.begin(); it != children.end(); ++it) {if (*it == component) {children.erase(it);break;}}}void print() override {cout << "Folder: " << name << endl;for (auto child : children) {child->print();}}
};// 叶子类
class Leaf : public Component {
private:string name;public:Leaf(const string& name) : name(name) {}void add(Component* component) override {cout << "Cannot add to a leaf." << endl;}void remove(Component* component) override {cout << "Cannot remove from a leaf." << endl;}void print() override {cout << "File: " << name << endl;}
};int main() {Component* root = new Composite("root");Component* folder1 = new Composite("folder1");Component* folder2 = new Composite("folder2");Component* file1 = new Leaf("file1");Component* file2 = new Leaf("file2");Component* file3 = new Leaf("file3");root->add(folder1);root->add(folder2);folder1->add(file1);folder1->add(file2);folder2->add(file3);root->print();delete root;delete folder1;delete folder2;delete file1;delete file2;delete file3;return 0;
}

输出结果

Folder: root
Folder: folder1
File: file1
File: file2
Folder: folder2
File: file3

解释

在示例中,使用组合模式创建了一个文件系统的树形结构。树的根节点是一个组合对象,包含了两个子节点(文件夹)。每个文件夹又包含了一些子节点(文件或其他文件夹)。通过使用组合模式,可以统一处理所有的节点,无论是文件夹还是文件,都可以使用相同的方式进行操作。

结论

组合模式提供了一种处理整体-部分结构的方式,使得客户端代码可以统一处理单个对象和组合对象。通过使用组合模式,可以实现树形结构的组织和操作,从而更好地管理复杂的对象结构。

应用场景

  • 处理树形结构的场景,例如文件系统、组织结构等。
  • 需要统一处理单个对象和组合对象的场景,例如图形界面中的组件布局、菜单系统等。
  • 需要递归地处理对象的场景,例如目录结构的遍历、文件搜索等。
  • 需要实现树形操作的场景,例如代码抽象语法树的操作。

总之,组合模式可以使得客户端无需区分单个对象和组合对象,可以统一地处理对象的层次结构。它提供了一种灵活且可扩展的方式来处理整体-部分结构,适用于需要处理层次结构的场景。

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

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

相关文章

企业想过等保,其中2FA双因素认证手段必不可少

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。等保2.0时代的到来&#xff0c;意味着企业和组织需要更加严格地保护自身的信息安全。而在这个过程中&#xff0c;双因素认证的重要性逐渐得到广泛认可。本文将探讨 2FA 双因素认证的重要性。 在了解 2FA 双因素认证的…

FastAPI学习-24.自定义异常处理器 exception_handler

前言 添加自定义处理器&#xff0c;要使用 Starlette 的异常工具。 安装自定义异常处理器 假设要触发的自定义异常叫作 UnicornException。 且需要 FastAPI 实现全局处理该异常。 此时&#xff0c;可以用 app.exception_handler() 添加自定义异常控制器&#xff1a; from f…

自动化机器学习AutoML之flaml:利用flaml框架自动寻找最优算法及其对应最佳参数python

AutoML 一、自动化机器学习包简介1、H2O (Python,R,Java,Scala)2、auto-sklearn(Linux,Python)3、FLAML(Python)4、AutoGlueon(安装比较啰嗦,略过)二、FLAML1、安装2、方法.fit()常用参数介绍3、代码(1) 解决分类问题(2)解决回归问题一、自动化机器学习包简介 机…

【GIT版本控制】--高级分支策略

一、分支合并策略 在Git中&#xff0c;高级分支策略是为了有效地管理和整合分支而设计的。其中一个关键方面是分支合并策略&#xff0c;它定义了如何将一个分支的更改合并到另一个分支。以下是几种常见的分支合并策略&#xff1a; 合并提交策略&#xff08;Merge Commit Stra…

2023-IDEA插件推荐

CamelCase 链接 https://plugins.jetbrains.com/plugin/7160-camelcase https://github.com/netnexus/camelcaseplugin 介绍 提供下划线、驼峰等代码风格的切换。快捷键是⇧ ⌥ U / Shift Alt U GsonFormatPlus 链接 https://plugins.jetbrains.com/plugin/14949-gs…

2023/10/7 -- ARM

【程序状态寄存器读写指令】 1.指令码以及格式 mrs:读取CPSR寄存器的值 mrs 目标寄存器 CPSR&#xff1a;读取CPSR的数值保存到目标寄存器中msr:修改CPSR寄存器的数值msr CPSR,第一操作数:将第一操作数的数值保存到CPSR寄存器中//修改CPSR寄存器&#xff0c;也就表示程序的状…

从哈希表到红黑树:探讨 epoll 是如何管理事件的?

一、引言 在计算机领域&#xff0c;事件通知是一种重要的机制&#xff0c;用于监视和响应各种事件&#xff0c;例如网络连接、文件IO、定时器等。随着计算机应用变得越来越复杂&#xff0c;对于高性能事件通知机制的需求也越来越迫切。传统的事件通知机制可能存在效率低下的问…

Redisson 集成SpringBoot 详解

一、引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.5</version></dependency> redison-spring-boot-starter依赖于与最新版本的spring-boot兼容…

Excel·VBA使用ADO读取工作簿工作表数据

目录 查询遍历写入数组查询整体写入数组查询工作簿所有工作表名称查询工作簿所有工作表数据 不打开工作簿读取数据&#xff0c;以下举例都为《ExcelVBA合并工作簿》中 7&#xff0c;合并子文件夹同名工作簿中同名工作表&#xff0c;纵向汇总数据所举例的工作簿&#xff0c;使用…

springboot概述

Spring Boot是一个用于创建独立的、生产级别的Spring应用程序的开源框架。它是Spring框架的一部分&#xff0c;但旨在简化Spring应用程序的开发和部署过程。以下是关于Spring Boot的主要概述&#xff1a; 简化配置&#xff1a;Spring Boot通过自动配置&#xff08;auto-configu…

SpringCloud(38):Spring Cloud Nacos discovery Starter配置项信息说明

配置项 Key默认值说明服务端地址 spring.cloud.nacos.discovery.server-addr无NacosServer 启动监听的ip地址和端口服务名 spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名服务分组 spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务…

后台开发核心技术与应用实践看书笔记(二):面向对象的C++

面向对象的C 类与对象类与对象的概念类的封装性构造函数析构函数静态数据成员静态成员函数对象的存储空间类模板析构函数与构造函数的执行顺序 继承与派生继承与派生的一般形式派生类的访问属性派生类的构造函数与析构函数&#xff08;看的还不够仔细&#xff09;派生类的构造函…

Angular学习笔记:路由

本文是自己的学习笔记&#xff0c;主要参考资料如下。 - B站《Angular全套实战教程》&#xff0c;达内官方账号制作&#xff0c;https://www.bilibili.com/video/BV1i741157Fj?https://www.bilibili.com/video/BV1R54y1J75g/?p32&vd_sourceab2511a81f5c634b6416d4cc1067…

Vue.js3学习篇--Vue模板应用

目录 一,模板基础 1.模板插值 &#xff08;1&#xff09;基础插值 &#xff08;2&#xff09;HTML代码插值 &#xff08;3&#xff09;标签属性插值 2.模板指令 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;指令参数 二.条件渲染 1.使用v-if指令渲染 2.使…

【网络安全 --- 工具安装】Centos 7 详细安装过程及xshell,FTP等工具的安装(提供资源)

VMware虚拟机的安装教程如下&#xff0c;如没有安装&#xff0c;可以参考这篇博客安装&#xff08;提供资源&#xff09; 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&am…

告警繁杂迷人眼,多源分析见月明

随着数字化浪潮的蓬勃兴起&#xff0c;网络安全问题日趋凸显&#xff0c;面对指数级增长的威胁和告警&#xff0c;传统的安全防御往往力不从心。网内业务逻辑不规范、安全设备技术不成熟都会导致安全设备触发告警。如何在海量众多安全告警中识别出真正的网络安全攻击事件成为安…

数据结构(2-5~2-8)

2-5编写算法&#xff0c;在单链表中查找第一值为x的结点&#xff0c;并输出其前驱和后继的存储位置 #include<stdio.h> #include<stdlib.h>typedef int DataType; struct Node {DataType data; struct Node* next; }; typedef struct Node *PNode; …

Pikachu靶场——远程命令执行漏洞(RCE)

文章目录 1. RCE1.1 exec "ping"1.1.1 源代码分析1.1.2 漏洞防御 1.2 exec "eval"1.2.1 源代码分析1.2.2 漏洞防御 1.3 RCE 漏洞防御 1. RCE RCE(remote command/code execute)概述&#xff1a; RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入…

接口测试总结

一、了解一下HTTP与RPC 1. HTTP&#xff08;HyperText Transfer Protocol) 说明&#xff1a;超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络协议。 优点&#xff1a;就是简单、直接、开发方便&#xff0c;利用现成的http协议进行传输。 流程图&#xff1a; 2. R…

非支配排序遗传算法NSGA

x i 优于 x j > 则称 x i 非支配于 x j 待看视频&#xff1a; 纯小白超详细的非支配排序遗传算法原理讲解_哔哩哔哩_bilibili 待读文章&#xff1a; 进化计算&#xff08;四&#xff09;——NSGA/NSGA II算法详解_nsga 求解单目标_南木长的博客-CSDN博客 进化计算…