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

安装Tailscale

如果返回 /usr/bin/tailscale 或类似路径,说明已安装但 sudo 可能找不到它。如果 which tailscale 没有输出,说明安装失败,重新执行安装步骤。Tailscale 的后台服务 tailscaled 必须运行。检查 tailscaled 服务是否运行。检查 tailscale 命令是否存在。

FairLikeSnow的博客 1471

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

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

以文会友 304

为什么大语言模型推理要分成 Prefill 和 Decode?深入理解这两个阶段的真正意义

Prefill 阶段是语言模型推理中的第一个步骤,它负责处理你输入的所有上下文内容(prompt),为后续生成打下基础。“请解释一下 Transformer 的原理。这句话会被 tokenizer 编码为一串 token,比如["请", "解释", "一下", "Trans", "##former", "的", "原理", "。"]。然后这些 token 会进入 Transformer 模型进行前向传播。重点来了 👇。

Harry的博客 1万+

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

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

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

zzl_python的博客 402

Moodle平台题库建设技术

Moodle平台题库建设技术简述1新的改变1功能快捷键1合理的创建标题,有助于目录的生成1如何改变文本的样式1插入链接与图片1如何插入一段漂亮的代码片1生成一个适合你的列表1创建一个表格1设定内容居中、居左、居右1SmartyPants1创建一个自定义列表1如何创建一个注脚注释也是必不可少的1KaTeX数学公式1新的甘特图功能,丰富你的文章1UML 图表1FLowchart流程图1导出与导入导出1...

lxf78的博客 4534

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

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

慢慢记录,慢慢更新。 1957

OpenClaw 核心命令深度解析:/think high、/reasoning on、/verbose on 功能与实战指南

本文深入解析OpenClaw框架的三大核心命令:/think high实现极限深度推理,突破常规思考瓶颈;/reasoning on提供透明化推理过程,增强决策可信度;/verbose on控制详细输出级别。文章从技术架构、实现原理、配置方法和典型场景四个维度,详细阐述了各命令的功能特性与实战应用,包括法律分析、代码调试和商业决策等复杂场景的最佳实践。同时提供了多级配置方案和资源消耗参考,帮助用户根据任务复杂度灵活调配AI资源,实现效率与深度的最优平衡。

qq_43344878的博客 943

Kong API Gateway 配置与深入

Kong是一个开源的、高性能的API网关,提供了一种简单易用的服务间路由、流量管理和安全防护方案,其最初起源于Nginx Inc.,但后迁移至Apache Software Foundation。Kong支持RESTful、GraphQL、TCP/UDP等协议,可与AWS Lambda、Azure Functions、Google Cloud Functions等云函数平台集成。其主要功能包括:服务发现与负载均衡、请求代理、身份认证与授权、缓存、日志记录、监控指标、灰度发布、多种插件等。

AI天才研究院 2283

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

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

IT1995的博客 7702

大厂硬件笔试机试题ASIC设计方向-卷3

本文提供了30道硬件工程师机试题目,涵盖数字逻辑、模拟电路、CMOS和信号处理等核心领域。选择题和判断题均配有详细解析,重点考察Verilog编程、CMOS特性、触发器设计、采样定理等知识点。题目难度适中但覆盖面广,如Verilog中阻塞/非阻塞赋值的区别、CMOS静态功耗来源、Nyquist采样定理、通用逻辑门判断等。备考建议强调掌握逻辑门设计、Verilog时序电路编写和CMOS特性理解。这些题目反映了华为等大厂硬件机试的典型考查内容,通过系统复习可有效提升机试成绩,为后续面试奠定基础。

启芯硬件的博客 544

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

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

莫寒技术人生 1626

2、欧洲期权的赫斯顿模型

本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。

tequila的博客 350

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

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

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

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

K1_uestc的博客 1587

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

无敌岩雀的博客 1717

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【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、付费专栏及课程。

余额充值