19.组合模式(Composite)

news2025/6/3 21:16:59

意图:将对象组成树状结构以表示“部分-整体”的层次结构,使得Client对单个对象和组合对象的使用具有一致性。

上下文:在树型结构的问题中,Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装,统一简单元素和复杂元素的概念,让对象容器自己来实现自身的复杂结构,让Client可以像处理简单元素一样来处理复杂元素,从而使Client与复杂元素的内部结构解耦?

UML

在这里插入图片描述

Component:为Composite中的对象声明接口;在适当情况下,实现所有类公共接口的默认行为;声明一个接口,用于访问和管理Component的子部件;在递归结构中定义一个接口,用于访问一个父部件,并在适当的情况下实现它。
Leaf:在Composite中表示叶子对象。
Composite:存储子部件,并定义有子部件的那些部件的行为。
Client:通过Component接口操作Composite的对象。

在这里插入图片描述

代码:

#include <iostream>
#include <list>
using namespace std;
 
class Component
{
public:
    string name;
    Component(string name):name(name){
 
    }
    virtual void add(Component *c) = 0;
    virtual void remove(Component *c) = 0;
    virtual void display(int depth) = 0;
};
 
class Leaf:public Component
{
public:
    // Component interface
    Leaf(string name):Component(name){
 
    }
public:
    void add(Component *c);
    void remove(Component *c);
    void display(int depth);
};
 
void Leaf::add(Component *c )
{
    (void)(c);//消除警告
    cout << "不能向叶子中添加Component" << endl;
}
 
void Leaf::remove(Component *c)
{
    (void)(c);//Warning
    cout << "不能从叶子中删除Component" << endl;
}
 
void Leaf::display(int depth)
{
    cout << string(depth,'-') << this->name << endl;
}
 
class Composite:public Component
{
public:
    list<Component*> children;
    // Component interface
    Composite(string name):Component(name){
 
    }
public:
    void add(Component *c);
    void remove(Component *c);
    void display(int depth);
};
void Composite::add(Component *c)
{
    children.push_back(c);
}
 
void Composite::remove(Component *c)
{
    children.remove(c);
}
 
void Composite::display(int depth)
{
    cout << string(depth,'-') << this->name << endl;
    list<Component*>::iterator it;
    for(it = children.begin();it != children.end();it++){
        Component *c = *it;
        c->display(depth + 2);
    }
}
int main()
{
    Composite *root = new Composite("树干");
    root->add(new Leaf("树叶1"));
    root->add(new Leaf("树叶2"));
 
    Composite *c1 = new Composite("树枝1");
    c1->add(new Leaf("树叶1-1"));
    c1->add(new Leaf("树叶1-2"));
    root->add(c1);
 
    Composite *c1_1 = new Composite("树枝1-1");
    c1_1->add(new Leaf("树叶1-1-1"));
    c1_1->add(new Leaf("树叶1-1-2"));
    c1->add(c1_1);
    root->add(new Leaf("树叶3"));
    root->display(1);
 
    return 0;
}

结果

-树干
---树叶1
---树叶2
---树枝1
-----树叶1-1
-----树叶1-2
-----树枝1-1
-------树叶1-1-1
-------树叶1-1-2
---树叶3

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

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

相关文章

R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据...

全文链接&#xff1a;http://tecdat.cn/?p24492 此分析的目的是构建一个过程&#xff0c;以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括 1258 天的股票收益&#xff08;点击文末“阅读原文”获取完整代码数…

huggingface连接不上的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

北斗导航 | RTD、RTK完好性之B值、VPL与HPL计算(附B值计算matlab源代码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 1、S矩阵获取 为第i颗卫星测距标准差:

ChatGLM Embedding+LangChain构建行业知识库

写在前面 私有AI知识库的价值巨大。不管是个人、企业或者行业,都可以用它来打造定制化的垂直智库。基于AI大模型的能力,知识的检索和应用将变得异常简单。目前很多行业都在探索落地,比如AI客服、AI导诊、AI法律助手等。 在上两篇文章中,介绍了如何利用白嫖阿里云服务器,D…

Facebook最佳聊单工具--SaleSmartly,智能回复+控评+群控分流

关于SaleSmartlySaleSmartly--全渠道客户沟通平台,它可以帮助企业实现聊天自动化、智能化&#xff0c;提高员工效率&#xff0c;降低人工成本&#xff0c;提升客服质量。 在管理facebook时&#xff0c;你遇到的痛点&#xff1a; &#xff08;1&#xff09;FB聊单如何实现业务最…

黄金代理前景如何,有得搞吗?

现货黄金代理这个职业时常都听人说过了&#xff0c;随着近期现货黄金走势不断出现行情&#xff0c;尤其是美国通胀严重&#xff0c;地缘政治局势频发&#xff0c;黄金走势不断获得支撑而走高。在这样的背景下&#xff0c;现货黄金代理这个职业的前景如何呢&#xff1f; 其实对于…

[python 刷题] 128 Longest Consecutive Sequence

[python 刷题] 128 Longest Consecutive Sequence 题目&#xff1a; Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence. You must write an algorithm that runs in O(n) time. 这题给了一个没有排序的数组&#x…

xyhcms getshell

下载xyhcms3.6.2021版本并用phpstudy搭建 function get_cookie($name, $key ) {if (!isset($_COOKIE[$name])) {return null;}$key empty($key) ? C(CFG_COOKIE_ENCODE) : $key;$value $_COOKIE[$name];$key md5($key);$sc new \Common\Lib\SysCrypt($key);$value $sc-…

php函数usort使用方法

在 PHP 中&#xff0c;usort() 函数用于对数组进行排序&#xff0c;它允许你使用自定义的比较函数来确定元素的顺序。以下是 usort() 函数的使用方法&#xff1a; usort(array &$array, callable $cmp_function): bool参数说明&#xff1a; $array&#xff1a;要排序的数…

增强企业的网络防御:从哪里开始

在当今的数字环境中&#xff0c;网络安全事件已经变得异常普遍&#xff0c;影响着各种规模和行业的企业。中小型企业 (SME) 不再局限于知名组织&#xff0c;由于其潜在的漏洞和应对复杂威胁的资源有限&#xff0c;越来越多地成为网络犯罪分子的目标。 2023 年第一季度&#xf…

Wi-Fi7将带来前所未有的快捷、稳定的互联网,更快的传输速度

随着科技的飞速发展&#xff0c;无线连接技术也日渐成熟与先进。Wi-Fi&#xff0c;作为我们日常生活和工作中不可或缺的一部分&#xff0c;也正在迎来技术的革新。我们将有机会见识到新一代的Wi-Fi技术&#xff0d;&#xff0d;Wi-Fi 7&#xff0c;它将带来前所未有的快捷、稳定…

DES算法子密钥的生成过程

DES算法的一次执行中将进行16轮迭代加密&#xff1b; 从原始的56位密钥中得到16个轮密钥k&#xff0c;每个轮密钥ki是48位&#xff1b; 轮密钥也叫子密钥&#xff1b; 下面看一下子密钥的生成过程&#xff1b; 大体过程是这样&#xff1b;看下图&#xff0c; 此图来自 34.《…

『贪吃蛇』AI 算法简易实现(中秋特别版)

前言 一年一度的中秋节就快到了&#xff0c;平台也有各种各样的中秋发文活动&#xff0c;正在翻阅时偶然间我看到了这篇文章&#xff1a;《兔饼大作战》&#xff1a;吃月饼、见月亮&#xff0c;还能咬自己&#xff1f;| 欢庆中秋特制版 - 掘金 (juejin.cn) 大家肯定比较熟悉了…

XML文件序列化读取

原始XML文件 <?xml version"1.0" encoding"utf-8" ?> <School headmaster"王校长"><Grade grade"12" teacher"张老师"><Student name"小米" age"18"/><Student name&quo…

重装系统(配置环境)

这里写目录标题 0.重装系统1.python1.1 anaconda1.2 pycharm1.3 深度学习环境配置 2.java2.1.安装JDK2.2.配置JDK环境变量2.3IDEA2.4 Maven 3.大数据3.1 虚拟机3.2 Hadoop平台3.3 存储3.4 采集3.5 计算3.6 查询3.7 可视化 0.重装系统 // An highlighted block var foo bar;1.…

Python爬虫(二十一)_Selenium与PhantomJS

本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据&#xff0c;更多内容请参考&#xff1a;Python学习指南 Selenium Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我…

数据包络分析(DEA)——CCR模型

写在前面&#xff1a; 博主本人大学期间参加数学建模竞赛十多余次&#xff0c;获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路&#xff0c;故将数学建模常用数学模型算法汇聚于此专栏&#xff0c;希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

单元测试spring-boot-starter-test

参考博客&#xff1a; https://www.cnblogs.com/mzc1997/p/14306538.html 配置pom junit-vintage-engine junit4 junit-jupiter-engine junit5 排除junit4使用junit5,两者在切换时要特别注意 <dependency><groupId>org.springframework.boot</groupId><…

惯性动捕+数据手套,让“虚拟”触手可及

当今&#xff0c;虚拟现实技术已经从科幻电影走进现实生活。在数字化时代&#xff0c;惯性动作捕捉系统与数据手套的结合使用&#xff0c;带给我们全新的虚拟互动体验&#xff0c;使虚拟世界更能够“触手可及”。 01 惯性动作捕捉系统 FOHEART MAGIC是一款高性能的惯性动作捕…

windows 安装Linux子系统 Ubuntu 并配置python3

环境说明&#xff1a; Windows 11 Ubuntu 20.04.6 安装步骤以及问题&#xff1a; 1、开启Windows Subsystem for Linux dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 2、开启虚拟机特性 dism.exe /online /enabl…