当前位置: 首页 > news >正文

【设计模式】组合模式(Composite)

目录

一、问题导入

二、代码实现

三、课件内容(我个人认为内容模糊且交叉,有些地方我认为是不准确或者是不正确的)

1.为什么用(Why)

2.什么时候用(When)

3.怎么用(How)

4.锐评

四、优劣

1.优势

2.劣势

五、个人补充


前言:该设计模式在我的另一篇【OpenGL】父子级关系中也做了一定的阐述,本文有一部分阐述全都由那篇文章拷贝而来。感兴趣的可以去看一下【OpenGL】父子级关系-CSDN博客

一、问题导入

组合模式是一种树形结构,通过扩充子节点的方式将整体与部分组合起来,不仅可以通过遍历更新所有子节点,还可以通过递归的形式将整体的行为逻辑施加给子节点。

试着去移动我们的手臂,平移大臂,此时小臂会跟着大臂一起移动,接着弯曲小臂,大臂并不会随着小臂移动。这个时候,大臂的具体状态就是其经过平移后的位置,而小臂则是小臂弯曲与大臂平移的叠加后的位置。这个时候小臂为“子”,而大臂为“父”,“父”的变化会牵连着所有的“子”,反之不行。(骨骼动画便是这样的典型应用)

二、代码实现

这样的组合模式是一个树形结构,每一个抽象的Object都会连着若干个Object

值得欣慰的是,这种结构的实现相当简单!

//树形结构组件
class Object
{
public://添加子节点void add_child(Object* child) { children.push_back(child); }virtual void on_update(){//更新所有子节点for (auto child : children)child->on_update();}
private:std::vector<Object*> children;//容器存储子节点
};

大小臂移动的实例代码:(在这里,将小臂作为大臂的一个子节点,那么当进行大臂的更新的时候,就会同时更新小臂)

#pragma once#include<iostream>
#include<vector>namespace _CompositePattern
{ //树形结构的地基class Object{public://添加子节点void add_child(Object* child) { children.push_back(child); }virtual void on_update(){//更新所有子节点for (auto child : children)child->on_update();}private:std::vector<Object*> children;//容器存储子节点};//小臂class ForeArm : public Object{public:void on_update() override{std::cout << "小臂移动" << std::endl;Object::on_update();}};//大臂class UpperArm : public Object{public:void on_update() override{std::cout << "大臂移动" << std::endl;Object::on_update();}};void test(){Object* upper_arm = new UpperArm();Object* fore_arm = new ForeArm();//将小臂链接到大臂上upper_arm->add_child(fore_arm);//移动大臂,此时小臂也会移动upper_arm->on_update();delete upper_arm;delete fore_arm;}
}

运行结果:

三、课件内容(我个人认为内容模糊且交叉,有些地方我认为是不准确或者是不正确的)

1.为什么用(Why)

(1)将对象组合成树形结构,以表示部分 - 整体的层次结构。组合模式使得用户对单个对象和组合对象的使用保持一致。

(2)将复杂元素当作简单元素来处理,从而使客户端程序与复杂元素的内部结构解耦。

2.什么时候用(When)

(1)树枝和树叶实现统一的接口,树枝在内部组合该接口。

(2)该接口在树枝内部组装,并包含内部属性列表,列表中放置组件(Component)。

3.怎么用(How)

(1)树枝和树叶实现统一的接口,树枝在内部组合该接口。

(2)该接口在树枝内部组装,并包含内部属性列表,列表中放置组件(Component)。

4.锐评

英雄所见略同

四、优劣

1.优势

(1)高层模块调用简单。

(2)节点可自由增加(符合开闭原则,OCP)。

2.劣势

(1)难以给功能差异过大的类提供通用接口。

(2)树叶和树枝都是实现类(违反依赖倒置原则,DIP)。(个人存疑

五、个人补充

组合模式的应用十分广泛,包括文件系统、骨骼动画,以及各类渲染引擎和游戏引擎的场景结构。这种设计模式巧妙地通过统一接口,实现了客户端与节点结构的解耦,让我们操作节点时(比如删除文件夹、移动骨骼),不用区分操作的是整体(父节点)还是部分(子节点),也不用手动处理它们的联动逻辑。

http://www.dtcms.com/a/524519.html

相关文章:

  • 【论文精读】Matten:融合 Mamba 与 Attention 的视频生成新范式
  • HTB Networked writeup(network-scripts提权)
  • 如何入门python机器学习?金融从业人员如何快速学习Python、机器学习?机器学习、数据科学如何进阶成为大神?
  • 网站开发技术交流中国国家培训网
  • 网站无法做301重定向网站查询域名入口
  • 国产数据库MongoDB兼容性技术分析与实践对比
  • 350做网站深圳零基础网站建设入门到精通视频教程
  • 冒泡排序代码实现详解
  • 金仓多模数据库平替MongoDB的电子证照国产化实践——从2TB数据迁移到1600+并发支撑
  • 【优先级队列(堆)】3.前 K 个⾼频单词 (medium)
  • 苏州建站公司 诚找苏州聚尚网络设计图案用什么软件
  • 数据结构——快速排序
  • IntelliJ IDEA新版下载、安装、创建项目及Maven配置的教程(附安装包等)
  • C++特性详解:extern、缺省参数、函数模板与名字空间
  • VUE+Electron从0开始搭建开发环境
  • MongoDB 平替新方案:金仓多模数据库驱动电子证照国产化落地
  • 项目(一)
  • SaaS多租户架构实践:字段隔离方案(共享数据库+共享Schema)
  • 企业网站网页设计的步骤房地产网站建设需求说明书
  • 中国专门做生鲜的网站著名品牌展厅设计
  • 开发避坑指南(66):IDEA 2025 Gradle构建安全协议警告:Maven仓库HTTPS切换或允许HTTP的配置方法
  • 前端新手入门-HBuilder工具安装
  • AceContainer::Initialize()函数的分析
  • 石家庄网站建设方案咨询涉县住房与城乡建设厅网站
  • 鸿蒙Next媒体开发全攻略(ArkTS):播放、录制、查询与转码
  • vs2015网站开发基础样式福田庆三下巴
  • Hugging Face介绍
  • 要建立网站和账号违法违规行为数据库和什么黑名单企业所得税优惠税率
  • 大模型训练中的关键技术与挑战:数据采集、微调与资源优化
  • 【文献笔记】arXiv 2018 | PointSIFT