[C++][设计模式][组合模式]详细讲解

目录

  • 1.动机(Motivation)
  • 2.模式定义
  • 3.要点总结
  • 4.代码感受


1.动机(Motivation)

  • 软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象结构)的变化引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端
  • 如何将”客户代码与复杂的对象容器结构“解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

2.模式定义

  • 定义:将对象组合成树形结构以表示”部分-整体“的层次结构
  • 功能:Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)
  • 结构
    请添加图片描述

3.要点总结

  • Composite模式采用树性结构来实现普遍存在的对象容器,从而将”一对多“的关系转化为”一对一“的关系,使得客户代码可以一致地(复用)处理对象和对象容器, 无需关心处理的是单个的对象,还是组合的对象容器
  • 将“客户代码与复杂的对象容器结构”解耦是Composite的核心思想,解耦之后,客户代码与纯粹的抽象接口 —— 而非对象容器的内部实现结构发生依赖,从而更能”应对变化“
  • Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技术来改善效率

4.代码感受

class Component
{
public:virtual void process() = 0;virtual ~Component(){}
};//树节点
class Composite : public Component
{string name;list<Component*> elements;
public:Composite(const string& s) : name(s) {}void add(Component* element) {elements.push_back(element);}void remove(Component* element){elements.remove(element);}void process(){//1. process current node//2. process leaf nodesfor (auto &e : elements)e->process(); //多态调用}
};//叶子节点
class Leaf : public Component
{string name;
public:Leaf(string s) : name(s) {}void process(){//process current node}
};void Invoke(Component& c)
{//...c.process();//...
}int main()
{Composite root("root");Composite treeNode1("treeNode1");Composite treeNode2("treeNode2");Composite treeNode3("treeNode3");Composite treeNode4("treeNode4");Leaf leat1("left1");Leaf leat2("left2");root.add(&treeNode1);treeNode1.add(&treeNode2);treeNode2.add(&leaf1);root.add(&treeNode3);treeNode3.add(&treeNode4);treeNode4.add(&leaf2);process(root);process(leaf2);process(treeNode3);
}

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

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

相关文章

【Android面试八股文】什么是ANR?如何分析和定位ANR?如何避免ANR?

文章目录 一、ANR概述二、触发ANR的主要场景三、Android四大组件中的潜在的ANR风险五、避免ANR的实践建议六、ANR的产生原因与出现的场景6.1 原因:6.2 出现场景:七、ANR的定位与分析7.1. ANR分析思路——traces7.2 ANR其他分析思路与相关日志7.2.1 分析logcat思路7.2.2 分析k…

解释Java中的Java IO流模型。

Java IO流模型是Java中用于处理输入和输出的基础模型。它通过一组类和接口来实现文件、网络和其他I/O设备的读写操作。Java IO流模型主要包括以下几个部分&#xff1a; 1. **InputStream和OutputStream**&#xff1a;这些类是Java IO的核心&#xff0c;它们提供了一种抽象的方…

如何避免爬取网站时IP被封?

互联网协议 (IP) 地址是识别网络抓取工具的最常见方式。IP 是每个互联网交换的核心&#xff0c;对其进行跟踪和分析可以了解很多有关连接客户端的信息。 在网络抓取中&#xff0c;IP 跟踪和分析&#xff08;又名指纹&#xff09;通常用于限制和阻止网络抓取程序或其他不需要的访…

计算两个经纬度之间的球面距离(基于Mysql和PHP实现)

计算两个经纬度之间的球面距离 1、MySQL实现方式 - 基于空间函数(ST_Distance_Sphere)实现 前置条件&#xff1a;确保您使用的是 MySQL 8.0 或更高版本&#xff0c;因为较早的版本对地理空间的支持有限。 1.1 创建表和索引 说明&#xff1a;设置 location 为 point 类型 #…

hive乱码问题完全解决方案

修改数据库编码集 SET GLOBAL character_set_client utf8; SET GLOBAL character_set_connection utf8; SET GLOBAL character_set_database utf8; SET GLOBAL character_set_results utf8; SET GLOBAL character_set_server utf8; show variables like ‘character_set%…

c++ set和unordered_set区别

一.set介绍 C 中的 set 容器是一种关联容器&#xff0c;用于存储唯一的元素&#xff0c;并能够根据特定的顺序对元素进行排列。在这里&#xff0c;我们将对 set 容器进行详细的分析。 概述 set 容器是 C标准库中的一个部分&#xff0c;位于 头文件中。它是一个关联容器&…

基于Java的智能城市解决方案

基于Java的智能城市解决方案 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨基于Java的智能城市解决方案&#xff0c;探索如何利用现代技术构建智…

【Python数据分析及环境搭建】:教程详解1(第23天)

系列文章目录 Python进行数据分析的优势常用Python数据分析开源库介绍启动Jupyter服务Jupyter Notebook的使用 文章目录 系列文章目录前言学习目标1. Python进行数据分析的优势2. 常用Python数据分析开源库介绍2.1 NumPy2.2 Pandas2.3 Matplotlib2.4 Seaborn2.5 Sklearn2.6 Ju…

[AHK V2]鼠标悬停展开窗口,鼠标离开折叠窗口

演示鼠标悬停窗口标题栏则展开窗口&#xff0c;鼠标离开窗口标题栏则折叠窗口。 ;作者&#xff1a;sunwind ;日期&#xff1a;2024年6月30日11:36:08 ;脚本&#xff1a;演示鼠标悬停窗口标题栏则展开窗口&#xff0c;鼠标离开窗口标题栏则折叠窗口。 MyGui : Gui() mytext:MyG…

第一 二章 小车硬件介绍-(全网最详细)基于STM32智能小车-蓝牙遥控、避障、循迹、跟随、PID速度控制、视觉循迹、openmv与STM32通信、openmv图像处理、smt32f103c8t6

第一篇-STM32智能小车硬件介绍 后续章节也放这里 持续更新中&#xff0c;视频发布在小B站 里面。这边也会更新。 B站视频合集: STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 小B站链接:https://www.bilib…

启航IT世界:高考后假期的科技探索之旅

随着高考的落幕&#xff0c;新世界的大门已经为你们敞开。这个假期&#xff0c;不仅是放松身心的时光&#xff0c;更是为即将到来的IT学习之旅打下坚实基础的黄金时期。以下是一份专为你们准备的IT专业入门预习指南&#xff0c;希望能助你们一臂之力。 一&#xff1a;筑基篇&a…

STM32F407ZGT6驱动TFT屏ILI9341(硬件SPI)

硬件连接 我购买的是ili9341,2.8inch&#xff0c;带触摸 开发板是野火stm32f407霸天虎 LCD模块STM32单片机VCCDC5V/3.3VGNDGNDSDI(MOSI)PB5SDO(MISO)PB4LEDPB13SCKPB3DC/RSPB14RSTPB12CSPB15触摸连接T_IRQPB1T_DOPB2T_DINPF11T_CSPC5T_CLKPB0 初始化 本次使用的是硬件SPI1&…

Bootstrap 缩略图

Bootstrap 缩略图 引言 Bootstrap 是一个流行的前端框架,它提供了一套丰富的组件和工具,帮助开发者快速构建响应式和移动优先的网页。缩略图(Thumbnails)是 Bootstrap 中的一种组件,用于展示图片或其他媒体内容,通常与标题和文本描述一起使用,形成一个整洁的布局。本文…

新版MinIO安装,附带问题处理和SSL设置(巨详细)

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 下面开始&#xff1a; 前往官网下载需要的二进制文件 wget https://dl.min.io/server/minio/release/linux-am…

element ui中的scss语法理解

摘录至 导读 首先来看一个bem命名示例 .el-message-box{} .el-message-box__header{} .el-message-box__header--active{}如果使用已经封装好的bem方法的话&#xff0c;那么可以写成 include b(message-box) {include e(header) {include m(active);} }接下来我们来看一下b…

【FPGA】Verilog:全减器与半减器 | Full Subtractor | Half Subtractor

0x00 全减器(Full Subtractor) 减法器是用于减法运算的逻辑电路,与不包含借位的半减法器不同。 全减法器因为包含借位的产生与否,所以具备完整的减法功能。 输出由差 和借位 组成:

JUC基础学习

1.Java JUC简介 2.volatile关键字-内存可见性 3.原子变量-CAS算法 4.ConcurrentHashMap锁分段机制

什么是滴答定时器?

滴答定时器&#xff08;Tick Timer&#xff09;是一种关键的硬件组件&#xff0c;用于生成固定时间间隔的信号。这些信号通常称为“滴答”&#xff08;tick&#xff09;&#xff0c;是操作系统和应用程序的时间管理基础。滴答定时器的应用范围广泛&#xff0c;从简单的定时任务…

Java中的数据加密与安全传输

Java中的数据加密与安全传输 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下在Java中如何实现数据加密与安全传输。 随着互联网的普及和网络…

C++学习/复习18----迭代器/反向迭代器及在list/vector中的应用、list与vector模拟实现复习

迭代器是一个对象&#xff0c;可以循环访问 C 标准库容器中的元素&#xff0c;并提供对各个元素的访问。 C 标准库容器全都提供迭代器&#xff0c;以便算法可以采用标准方式访问其元素&#xff0c;而不必考虑用于存储元素的容器类型。 一、反向迭代器类 基于普通迭代器构建反…