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

embedded/2024/9/23 7:23:40/

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.ppmy.cn/embedded/17934.html

相关文章

富格林:养成可信操作稳健出金

富格林认为&#xff0c;在黄金投资过程中&#xff0c;有许多方法、技能和基础知识是影响投资者稳健出金的关键因素。因此&#xff0c;投资者需要养成对这些可信知识的掌握有助于获得更稳定的盈利出金。以下是黄金现货投资过程中需要了解的一些可信操作技巧。相信学习了这些富格…

【Linux】IO多路转接技术Epoll的使用

【Linux】IO多路转接技术Epoll的使用 文章目录 【Linux】IO多路转接技术Epoll的使用前言正文接口介绍工作原理LT模式与ET模式边缘触发&#xff08;ET&#xff09;水平触发&#xff08;LT&#xff09; 理解ET模式和非阻塞文件描述符ET模式epoll实现TCP服务器简单地封装epoll系统…

docker-MySQL 8 主从搭建

一.目录结构&#xff1a; 我是在/home目录下&#xff0c;建立个sql文件夹&#xff1a; 二、配置文件 1.mysql配置 mysql-master下.conf文件配置 ###### [mysqld] server-id1 # 启用二进制日志 log-binmaster-bin # 指定需要复制的数据库 binlog-do-dbtest_db # 指定二进制日…

探索设计模式的魅力:AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;AI赋能分层模式&#xff0c;解构未来&#xff0c;智领风潮 ✨欢迎…

网络安全-态势感知

网络安全态势感知是一种对网络安全性定量分析的一种手段&#xff0c;成已经为网络安全2.0时代安全技术的焦点&#xff0c;对保障网络安全起着非常重要的作用。 为什么需要态势感知 态势感知的概念最早在军事领域被提出&#xff0c;覆盖了感知、理解和预测三个层次。并随着网络…

K8S Centos7 安装 K8S 1.26单机版

文章目录 1.机器规划1.设置hostname2.编辑/etc/hosts3.安装ntpdate并同步时间4.关闭防火墙5.关闭selinux 2.安装 Docker1.安装Docker2.安装容器运行时cri-dockerd 3.安装K8S1.禁用swap2.安装Kubernetes相关软件3.master节点拉取k8s镜像4.初始化Kubernetes Master节点5.在集群中…

ssm082基于java斗车交易系统设计与实现+vue

斗车交易系统 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&…

架构师的六大生存法则与价值创造

目录 什么影响架构的成败 架构师的六大生存法则 一、所有的架构规划必须有且只有一个正确的目标 二、架构活动需要尊重和顺应人性 三、架构活动在有限的资源下最大化商业价值 四、架构师要考虑依赖的商业模块和技术生命周期 五、架构师为什么要关注技术体系的外部适应性…