组合模式【结构型模式C++】

1.概述

       组合模式又叫部分整体模式属于结构型模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

2.结构

  • 组件(Component):定义了组合中所有对象的通用接口,可以是抽象类或接口。它声明了用于访问和管理子组件的方法,包括添加、删除、获取子组件等。
  • 叶子节点(Leaf):表示组合中的叶子节点对象,叶子节点没有子节点。它实现了组件接口的方法,但通常不包含子组件。
  • 复合节点(Composite):表示组合中的复合对象,复合节点可以包含子节点,可以是叶子节点,也可以是其他复合节点。它实现了组件接口的方法,包括管理子组件的方法。
  • 客户端(Client):通过组件接口与组合结构进行交互,客户端不需要区分叶子节点和复合节点,可以一致地对待整体和部分。

3.实现 

3.1 实例类比

      以电脑文件系统为例,其中有两种类型的文件:文本文件和文件夹。文本文件是叶子节点,文件夹是组合节点,可以包含其他文件。

     类体如下:

3.2 具体实现 
#include <iostream>
#include <string>
#include<vector>using namespace std;
/*** Component抽象类,表示目录条目(文件+文件夹)的抽象类**/
class Component {public:virtual string getName() = 0; //获取文件名virtual int getSize() = 0; //获取文件大小//添加文件夹或文件virtual Component* add(Component* entry) = 0;//显示指定目录下的所有信息virtual void printList(string prefix) {};
};/*** File类 表示文件**/
class File :public Component {private:string name_; //文件名int size; //文件大小public:File(string name, int size) {this->name_ = name;this->size = size;}string getName() {return name_;}int getSize() {return size;}Component* add(Component* entry) {return nullptr;}void printList(string prefix) {cout << prefix + "/" << name_ << endl;}};/*** Directory表示文件夹**/
class Directory :public Component {//文件的名字
private:string name_;//文件夹与文件的集合vector<Component*> directory;public://构造函数Directory(string name) {this->name_ = name;}//获取文件名称string getName() {return this->name_;}int getSize() {int size = 0;//遍历或者去文件大小for (auto it : directory) {size += it->getSize();}return size;}Component* add(Component* entry) {directory.push_back(entry);return this;}//显示目录void printList(string prefix) {cout << prefix << "/" << name_ << endl;for (auto it : directory) {it->printList(prefix + "/" + name_);}}
};int main()
{//根节点Directory *rootDir = new Directory("root");//树枝节点Directory *binDir = new Directory("bin");//向bin目录中添加叶子节点binDir->add(new File("test1", 1024));binDir->add(new File("test2", 2048));Directory *nginxlDir = new Directory("ngnix");Directory *confDir = new Directory("conf");nginxlDir->add(confDir);confDir->add(new File("nginx.conf", 30));rootDir->add(binDir);rootDir->add(nginxlDir);rootDir->printList("");return 0;
}
3.3运行结果 

4.状态设计模式优缺点

 优点: 

  1. 可以将对象组合成树形结构,表示整体-部分的层次关系。
  2. 可以统一处理单个对象和对象组合,简化了客户端的代码逻辑,提高了系统的可复用性
  3. 可以遵循开闭原则,扩展性高,增加新的节点类型时不需要修改原有代码。

缺点:

      对于功能差异较大的类, 提供公共接口或许会有困难。 在特定情况下, 你需要过度一般化组件接口, 使其变得令人难以理解。

5 应用场景

  • 当需要表示一个对象整体与部分的层次结构时,可以使用组合模式来实现树形结构。例如,文件系统中的文件与文件夹、组织机构中的部门与员工、商品分类中的类别与商品等。
  • 当需要统一处理单个对象和对象组合时,可以使用组合模式来实现多态性。例如,图形界面中的简单控件与容器控件、菜单系统中的菜单项与子菜单、报表系统中的单元格与表格等。
  • 当需要将对象的创建和使用分离时,可以使用组合模式来实现依赖注入。例如,Spring框架中的Bean对象与BeanFactory对象、测试框架中的测试用例与测试套件等。

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

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

相关文章

Kafka 3.x.x 入门到精通(06)Kafka进阶

Kafka 3.x.x 入门到精通&#xff08;06&#xff09;——对标尚硅谷Kafka教程 3. Kafka进阶3.1 Controller选举3.2 Broker上线下线3.3 数据偏移量定位3.4 Topic删除3.5 日志清理和压缩3.7 页缓存3.8 零拷贝3.9 顺写日志3.10 Linux集群部署3.10.1 集群规划3.10.2 安装虚拟机(略)3…

颠覆传统:机器人与AI大模型的结合,开启智能自动化的黄金时代!

引言&#xff1a;机器人技术与大模型的结合趋势 随着科技的迅速发展&#xff0c;机器人技术与大模型的结合已经成为必然趋势。这种结合不仅仅是技术的简单叠加&#xff0c;而是一种深层次的互补与融合&#xff0c;为机器人技术的应用开辟了新的可能性。大模型&#xff0c;能够…

4 -26

4-26 1 英语单词100个一篇六级翻译 2 div 4 补题目 3 概率论期中卷子一张&#xff0c;复习复习。 4 备课ing 晚上出去炫饭&#xff0c;串串香&#xff0c;无敌了。 中间一些模拟题是真的恶心&#xff0c;思维题是真的想不到&#xff0c;感觉自己就是一个废物呢。 1.是将一个数…

Postman 在 Linux 上的安装指南:简单快速开始使用

本文将介绍如何在 Linux 上安装 Postman 的详细步骤&#xff0c;Postman 支持的 Linux 的发行版包括&#xff1a;Ubuntu 14.04 及更高版本&#xff0c;Fedora 24&#xff0c;Debian 8 及更高版本。下面将介绍其具体的安装方法。 手动安装 Postman 的下载地址&#xff0c;下载…

线性代数:抽象向量空间

一、说明 有些函数系列极具线性代数的向量特征。这里谈及多项式构成函数的线性代数意义。问题是这个主题能展开多少内涵&#xff1f;请看本文的论述。 二、线性空间和向量 让我先问你一个简单的问题。什么是向量&#xff1f;为了方便起见&#xff0c;二维箭头从根本上说是平…

Synchronized关键字的深入分析

一、引言 在多线程编程中&#xff0c;正确地管理并发是确保程序正确运行的关键。Java提供了多种同步工具&#xff0c;其中synchronized关键字是最基本且最常用的同步机制之一。本文旨在深入解析synchronized的实现原理&#xff0c;探讨其在不同应用场景中的使用&#xff0c;并…

vivado 使用“链路 (Links)”窗口查看和更改链路设置

使用“链路 (Links) ”窗口查看和更改链路设置 创建链路后 &#xff0c; 就会将其添加到“ Links ”视图 &#xff08; 请参阅下图 &#xff09; 中 &#xff0c; 该视图是更改链路设置和查看状态的主要方法 &#xff0c; 也是最佳方法。 “ Links ”窗口中的每一行都对应 1 …

AI 语音机器人系统怎么搭建

搭建AI语音机器人系统通常包括以下几个关键步骤&#xff1a; 确定需求和技术选型&#xff1a;首先要明确AI语音机器人需要实现的功能&#xff0c;选择合适的技术框架和工具&#xff0c;如自然语言处理工具、语音识别工具等。 搜集和准备数据&#xff1a;收集和整理与业务相关…

一个不太好用的弹出层jquery.colorbox第二次点击不出来的解决方法

使用jquery.colorbox的时候第一次正常显示&#xff0c;但第二次的时候不显示。 需要先移除&#xff0c;再重新点击即可&#xff0c;代码如下 $.colorbox.remove();$.colorbox({href: url,iframe: true,width: options.width || 800,height: options.height || 600 });

Windows常见问题(技巧)总结

目录 问题Windows中更改快捷方式图标windows 中网速很慢,如何解决?因为Authenticated Users从其父系继承承权限&#xff0c;你无法删除此对象.Windows下的照片软件在哪个文件夹下?如何批量更改文件名?Windows 电脑pagefile.sys是什么文件,可以删除吗?U盘中打开文件时提示&a…

Linux下载及安装OpenSSL

文章目录 前言一、OpenSSL下载二、OpenSSL安装1.上传下载好的安装包到服务器2.解压3.切换目录4.配置config5.编译6.安装7.备份旧版本OpenSSL7.创建软链接8.添加OpenSSL动态链接库9.更新库缓存10.查看OpenSSL版本验证安装是否成功 前言 一般系统会自带有OpenSSL&#xff0c;我们…

PyQt5中QTablewidget生成右键菜单

QTablewidget生成右键菜单&#xff0c;需要自定义一个QTablewidget类 import sys from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QMenu, QAction, QDialog from PyQt5.QtCore import Qt from PyQt5 import QtCoreclass CustomTableWidget(QTabl…