C++设计模式之组合模式(九)

设计模式C++实现(7)——外观模式、组合模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

composite pattern

简介

  组合模式(Composite Pattern)是将多个对象组合形成树形结构,来表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即:叶子构件)和组合对象(即:容器构件)的使用具有一致性,组合模式又被称为“整体-部分”(Part-Whole)模式,属于结构型模式。
组合模式UML图

  • Component: 定义一个接口。
  • Leaf: 为叶子构件,不包含组件构件。
  • Composite: 为组合构件,包含子组件构件。

代码

// composite_pattern.h
class Component {
public:
    virtual ~Component() = default;

    virtual void Operator();

    virtual void add(std::shared_ptr<Component> component);

    virtual void remove(int index);

    virtual std::shared_ptr<Component> get_current_component(int index);
}; // component

class Leaf : public Component {
public:
    Leaf(std::string name);
    virtual void Operator();

private:
    std::string name_;
}; // Leaf

class Composite : public Component {
public:
    Composite(std::string name);
    virtual void Operator();

    void add(std::shared_ptr<Component> component);

    void remove(int index);

    std::shared_ptr<Component> get_current_component(int index);

private:
    std::vector<std::shared_ptr<Component> > com_v_;

    std::string name_;
}; // Composite
// composite_pattern.cpp
void Component::Operator() {

}

void Component::add(std::shared_ptr<Component> component) {

}

void Component::remove(int index) {

}

std::shared_ptr<Component> Component::get_current_component(int index) {
    return nullptr;
}

Leaf::Leaf(std::string name)
    /*: name_(name)*/{
    this->name_ = name;

}

void Leaf::Operator() {
    std::cout << this->name_ << ": " << __PRETTY_FUNCTION__ << std::endl;
}

Composite::Composite(std::string name)
    /*: name_(name)*/{
    this->name_ = name;
}

void Composite::Operator() {
    //todo
    std::cout << this->name_ << ": " << __PRETTY_FUNCTION__ << std::endl;
    for (auto it : this->com_v_)
        it->Operator();
}

void Composite::add(std::shared_ptr<Component> component) {
    this->com_v_.push_back(component);
}

void Composite::remove(int index) {
    this->com_v_.erase(this->com_v_.begin() + index);
}

std::shared_ptr<Component> Composite::get_current_component(int index) {
    return this->com_v_.at(index);
}

} // compposite_pattern


int main(){
    std::shared_ptr<Component> root = std::make_shared<Composite>("root");
    std::shared_ptr<Component> leaf_1 = std::make_shared<Leaf>("Leaf1");
    std::shared_ptr<Component> leaf_2 = std::make_shared<Leaf>("Leaf2");
    std::shared_ptr<Component> composite_1 = std::make_shared<Composite>("Composite1");
    std::shared_ptr<Component> composite_2 = std::make_shared<Composite>("Composite2");

    composite_1->add(composite_2);
    composite_1->add(leaf_2);

    root->add(leaf_1);
    root->add(leaf_2);
    root->add(composite_1);
    root->add(composite_2);

    root->Operator();
    std::cout << "*****************************************" << std::endl;
    std::shared_ptr<Component> component_tmp =  root->get_current_component(2);
    component_tmp->Operator();
	return 0;
}

// output
/*
root: virtual void patterns::compposite_pattern::Composite::Operator()
Leaf1: virtual void patterns::compposite_pattern::Leaf::Operator()
Leaf2: virtual void patterns::compposite_pattern::Leaf::Operator()
Composite1: virtual void patterns::compposite_pattern::Composite::Operator()
Composite2: virtual void patterns::compposite_pattern::Composite::Operator()
Leaf2: virtual void patterns::compposite_pattern::Leaf::Operator()
Composite2: virtual void patterns::compposite_pattern::Composite::Operator()
*****************************************
Composite1: virtual void patterns::compposite_pattern::Composite::Operator()
Composite2: virtual void patterns::compposite_pattern::Composite::Operator()
Leaf2: virtual void patterns::compposite_pattern::Leaf::Operator()
*/
C++常用设计模式之:组合模式 组合模式是一个特征非常鲜明的设计模式,特点就是它的定义一点也不抽象!!!。 组合模式定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式对单个对象(叶子节点)和组合对象(树节点)的使用具有一致性(送分题啊!同志们!一致性是啥,就是虚接口呗!)。 还用啥现实中的例子来说明,这就是妥妥的数据结构中的树形结构啊!人家定义都直接点明了。 UML结构图如下: 下面我用伪码来表述上面... 阅读详情

相关推荐

C++ 组合模式

组合模式(Composite Pattern)组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。

青春不老,奋斗不止! 1万+

测试类图Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现...

在改章节中,我们主要介绍测试类图的内容,自我感觉有个不错的建议和大家分享下     迭代器模式供提一种方法序顺问访一个聚合对象中的各个素元,而又不露暴其部内的示表。     计设准则:         单一任责准则:一个类应当只有一个引发化变的原因     源代码链接     图类:          测试结果:          每日一道理 冰心说道:“爱在左,同情在右,...

weixin_34150830的博客 131

激光雷达+相机标定避坑指南:手把手教你用KITTI数据完成坐标转换

本文详细介绍了激光雷达与相机标定的实战指南,利用KITTI数据集完成精准坐标转换。从数据准备、工具链搭建到标定矩阵加载与验证,再到坐标转换流水线的工程实现,提供了全面的避坑技巧和工程实践建议。特别强调了多传感器融合中的常见问题及解决方案,帮助开发者提升自动驾驶和机器人感知系统的环境感知精度。

book8的博客 835

设计模式学习笔记(C++实现)(九)--组合模式

1.组合模式简介 英文名称 Composite 主要目的 该模式将对象组合成树形结构已表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 使用场景 1.当你想表示对象的部分-整体层次结构时; 2.你希望用户忽略组合对象与单个对象的不同时,用户将统一地使用组合结构中的所有对象。 2.组合模式代码示例 测试平台 1.开发语言:C++ 2.开发工具:VS...

以文会友 304

从零到一:DETR模型在自定义数据集上的实战部署与调优

本文详细介绍了DETR模型在自定义数据集上的实战部署与调优过程,包括环境准备、数据转换、模型配置、训练技巧及问题排查。通过具体代码示例和实用建议,帮助开发者高效完成从零到一的DETR模型部署,特别适合目标检测领域的实践应用。

weixin_42524100的博客 462

把“思考”塞进 1 KB:我用纯 C 语言给单片机手搓了一个微型 Transformer 推理引擎

摘要:本文探讨了在64KB SRAM的MCU(如STM32H743)上部署精简Transformer模型的技术方案。通过将6层Transformer压缩至1层(隐藏维度128)、4-bit KV-Cache量化等优化手段,实现了240KB Flash占用和59KB RAM峰值,推理延迟184ms(400MHz Cortex-M7),准确率96.1%。关键创新包括:手工优化矩阵乘(CMSIS-NN)、查表法Softmax/LayerNorm、权重按Tile重排提升Cache命中率(60%→94%)。

qq_74383080的博客 2922

23种设计模式之(九)组合模式(python_c++实现)

23种设计模式之(九)组合模式(Composite) 本文主要介绍23种设计模式之组合模式,附详细python/c++示例代码。 - 概念 - 应用场景 - 注意事项 - 代码示例 - 总结 - 代码链接 组合模式(Composite) 概念 组合模式,是构造型的设计模式之一。通过递归手段依据树形结构来组合对象,用来表示部分以及整体层次,并可以通过一个对象来访问整个...

zzl_python的博客 402

在VSCode中使用LaTex+(grammarly语法检测,chatgpt翻译,Sumatra PDF 轻量级pdf阅读器)

整个文章分为以下几个内容,打 * 的是必须要安装的。

u011895157的博客 2万+

C++ 设计模式——组合模式

组合模式(Composite Pattern)是一种结构性设计模式,允许将一组对象组织成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的操作/使用/处理具有一致性。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,从而简化了客户端代码的复杂性。

慢慢记录,慢慢更新。 1957

基于Simulink的PID控制汽车巡航控制系统建模与仿真

汽车巡航控制系统(Cruise Control System)是一种通过自动调节发动机输出功率来维持车辆以恒定速度行驶的技术。这种系统能够减轻驾驶员在长途驾驶中的疲劳,同时提高燃油经济性和行车安全性。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于汽车巡航控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的汽车巡航控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 196

通过WorkVisual连接KUKA机器人的具体方法

通过WorkVisual连接KUKA机器人的具体方法

Robot_PLC_HMI_Automation 6843

C++设计模式-组合模式

目录 基本概念 代码与实例 基本概念 个人感觉Qt的对象树就是运用了这种设计模式!!! 当然,只是个人感觉,本人并没有研究Qt的源码 组合模式(Composite):将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 何时使用:需求中提现部分和整体的层次结构,开发者希望用户忽略组合对象与单个对象的不同,统一使用...

IT1995的博客 7702

YOLOv9分割训练自己数据和推理训练好模型,并教你使用Labelme工具标注数据(附YOLOv9分割模型结构图),全网最详细教程

YOLOv9 通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。PGI 适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9 被评价为新的 SOTA 实时目标检测器。接下来本文手把手教你训练自己分割数据集和推理训练好的分割模型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1492

C++ 设计模式 —— 组合模式

组合模式的定义组合模式的作用组合模式是一种行为型设计模式,它将对象组合成树形结构以表示部分 - 整体的层次结构。这种模式使得用户对单个对象和组合对象的使用具有一致性。组合模式主要应用于需要表示复杂对象结构或者需要将对象组合成树形结构的场景。组合模式的定义和作用:定义:组合模式通过一种巧妙的设计方案,可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点。

莫寒技术人生 1626

Python DEAP 库深度解析:从基础架构到高级应用

DEAP 是一个基于 Python 的开源框架,专门用于实现和运行各种进化算法,旨在帮助用户轻松地构建和调整进化算法,用于解决各种优化和搜索问题。本节中,介绍了 DEAP 相较于其它进化计算框架的优势,以及 DEAP 中重要的工具 creator 和 Toolbox。

盼小辉丶的博客 5084

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ 设计模式之组合模式

理解起来⽐较抽象,我们⽤“省份-城市”举个例⼦,省份中包含了多个城市,如果将之⽐喻成⼀个树形结构,城市就是叶⼦节点,它是省份的组成部分,⽽“省份”就是合成节点,可以包含其他城市,形成⼀个整体,省份和城市都是组件,它们都有⼀个共同的操作,⽐如获取信息。组合模式可以使得客户端可以统⼀处理单个对象和组合对象,⽆需区分它们之间的差异,⽐如在图形编辑器中,图形对象可以是简单的线、圆形,也可以是复杂的组合图形,这个时候可以对组合节点添加统⼀的操作。输出公司的组织结构,展示每个部门下的子部门和员工。

K1_uestc的博客 1587

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++设计模式结构型模式———组合模式

引人组合设计模式的定义:将一组对象(如文件和目录)组织成树形结构以表示“部分-整体”的层次结构(如目录中包含文件和子目录)。使得用户对单个对象(文件)和组合对象(目录)的操作/使用/处理(递归遍历并执行`ShowName`逻辑等)具有一致性。

无敌岩雀的博客 1717

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C++】组合模式

组合模式(Composite Pattern)是一种【结构型】设计模式,它允许你将对象组合成树形结构以表示 “部分 - 整体” 的层次关系。这种模式使得客户端可以统一处理单个对象和对象组合,无需区分它们的具体类型。

AAADiao的博客 1679

C++设计模式——组合模式(Composite Pattern)

C++设计模式——组合模式 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——组合模式目录定义定义结构代码示例总结使用场景及注意事项优缺点参考资料 定义 定义 Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly. 将对象组合成树形结

leonardohaig的博客 1587

【20】c++设计模式——>组合模式

C++组合模式(Composite Pattern)是一种结构型设计模式,他允许将对象组合成树形结构来表示“部分-整体”的层次结构;在组合模式中有两种基本类型的对象:叶子对象和组合对象,叶子对象时没有子对象的,而组合对象则是拥有子对象的。叶子对象和组合对象都实现了相同的接口,以便可以用相同的方式处理他们。

weixin_42097108的博客 969

C++设计模式之组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

weixin_42267862的博客 708

设计模式之组合模式

优点1)更好的扩展性:组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码。2)更好的复用性:更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。缺点:1)设计较复杂:客户端需要花更多时间理清类之间的层次关系。2)不容易限制容器中的构件:不容易用继承的方法来增加构件的新功能3)叶子和树枝的声明都是实现类,违反了依赖倒置原则。

红军不怕远征难,万水千山只等闲 1799

设计模式:组合模式 C++实现

文章目录前言1. 组合模式理解2. 组合模式C++实现总结参考 前言 今天复习了组合模式,实现了对象间树形结构关系,这里给大家分享下。 1. 组合模式理解 组合模式,顾名思义,通过组合关系定义类间的关联关系,实现了将对象组合成树形结构,最终实现类的复用。可能是由于设计模式看的多了,初看组合模式的类图,感觉和装饰者模式类图很相似,都是使用继承和组合关系,当然,也只是结构相似而已。 组合模式正规定义与类图(引用《大话设计模式》)如下所示: 2. 组合模式C++实现 这里以公司在不同地区有分部,不同城市

DU_YULIN的博客 1376

C++设计模式之——组合模式

在组合模式中,组合对象与单个对象(也称为叶子对象或简单对象)有着相同的接口,所以客户端可以一致地对待它们,无需知道处理的是单个对象还是整个组合结构。尽管以上代码已经实现了组合模式的核心思想,但在实际应用中,我们可能还需要考虑其他因素,例如访问子组件的方式可能不仅仅是按索引获取,还可以支持更灵活的方式来遍历所有子组件。声明了所有用来管理子组件的方法,比如添加、删除和获取子组件等,但在组合对象中实现这些方法,而在叶子对象中则可能提供默认或空实现。:是组合结构中的基本元素,没有子节点,实现了。

qqrrjj2011的博客 1157

精读C++20设计模式——结构型设计模式:组合模式

本文介绍了C++20中的组合设计模式,它属于结构型设计模式,核心思想是将对象组成树形结构来表示"部分-整体"层次关系,使用户对单个对象和组合对象的使用具有一致性。文章通过两个典型应用场景展示了组合模式的优势:一是将同类属性组合为数组简化访问(如游戏角色属性分析),二是将共同基类的子类对象组合为树形结构(如几何图形绘制)。作者指出组合模式在统一接口、扩展性强和层次清晰等方面具有优势,但也存在类型安全降低、设计复杂度增加等缺点,适用于需要表示树状层级结构且希望统一操作方式的场景。文章还展示了

charlie114514191的博客 862
上一篇: C++设计模式之装饰者模式(八)
下一篇: C++设计模式之外观模式(十)
一杯盐水
博客等级 码龄10年 62粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值