设计模式: 结构型之组合模式(6)

C#创建COM组件,QT调用COM组件简单测试(VS2008+QT4.6.4) 一. C#创建组件: 1. VS2008新建一个项目,选择Visual C#, Class library 修改Properties下面的AssemblyInfo.cs文件,ComVisible属性设置为True,即:[assembly: ComVisible(true)] 2. 右击项目,选择“属性”, 选择“生成”选项卡,把“为COM互操作注册”勾选上 选择“签名”选项卡,把“ 阅读详情

组合模式概述

  • 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构
  • 组合模式使得客户端对单个对象和复合对象的使用具有一致性
  • 在 TypeScript 中,组合模式通常涉及到一个接口(或抽象类),它定义了用于操作组件的方法
  • 然后,有两个具体的类实现这个接口
    • 一个是叶子节点类,它表示树形结构中的基本对象
    • 另一个是组合类,它表示包含其他组件的复合对象

组合模式示例

// 定义组件接口  
interface Component {  
  operation(): void;  
  add(component: Component): void;  
  remove(component: Component): void;  
  getChild(index: number): Component;  
}  
  
// 叶子节点类  
class Leaf implements Component {  
  private name: string;  
  
  constructor(name: string) {  
    this.name = name;  
  }  
  
  operation(): void {  
    console.log(`Leaf operation: ${this.name}`);  
  }  
  
  add(component: Component): void {  
    throw new Error("Leaf cannot add components");  
  }  
  
  remove(component: Component): void {  
    throw new Error("Leaf cannot remove components");  
  }  
  
  getChild(index: number): Component {  
    throw new Error("Leaf has no children");  
  }  
}  
  
// 组合类  
class Composite implements Component {  
  private children: Component[] = [];  
  
  operation(): void {  
    console.log("Composite operation");  
    for (const child of this.children) {  
      child.operation();  
    }  
  }  
  
  add(component: Component): void {  
    this.children.push(component);  
  }  
  
  remove(component: Component): void {  
    const index = this.children.indexOf(component);  
    if (index !== -1) {  
      this.children.splice(index, 1);  
    }  
  }  
  
  getChild(index: number): Component {  
    if (index < 0 || index >= this.children.length) {  
      throw new Error("Index out of range");  
    }  
    return this.children[index];  
  }  
}  
  
// 使用示例  
const composite = new Composite();  
const leaf1 = new Leaf("Leaf 1");  
const leaf2 = new Leaf("Leaf 2");  
composite.add(leaf1);  
composite.add(leaf2);  
composite.operation(); // 输出: Composite operation, Leaf operation: Leaf 1, Leaf operation: Leaf 2
  • 这里定义了一个接口:Component
  • 使用 Leaf 和 Composite 继承 Component
    • Leaf 类实现了 Component 接口,表示叶子节点,它只包含 operation 方法的实现,其他方法都抛出了错误,因为叶子节点不应该有子节点
    • Composite 类也实现了 Component 接口,表示复合节点,它包含了所有方法的实现,包括操作自身和子节点的方法
  • 最后,我们创建了一个 Composite 实例作为根节点,并向其中添加了两个 Leaf 实例作为子节点,然后调用了 operation 方法来演示组合模式的使用

组合模式的应用

  • 组合模式(Composite Pattern)的应用场景主要体现在那些需要表示对象的部分-整体层次结构
  • 并且希望客户端能以相同方式处理单个对象和对象集合的情况
  • 以下是组合模式的一些典型应用领域

1 ) 文件系统

  • 在文件系统中,目录(folders)和文件(files)可以构成一个层级结构
  • 目录可以包含子目录和文件,而文件则是叶子节点
  • 组合模式允许我们以统一的方式来操作文件和目录,例如创建、删除、移动、列出内容等,无论处理的是单个文件还是整个目录结构

2 ) GUI 组件库

  • 在图形用户界面(GUI)开发中,窗口、面板、按钮等控件可以嵌套组成复杂的界面结构
  • 组合模式使得我们可以一致地处理顶级容器组件(如窗口)和子组件(如按钮)
  • 无论是添加、删除、布局或绘制组件,都可以采用同样的接口进行

3 ) 组织结构

  • 在企业管理系统中,组织架构通常是一个分层结构,包括部门、小组和个人员工
  • 使用组合模式可以方便地管理和展示这种层级关系,如查询某个员工的所有上级领导、计算某个部门的总人数、调整组织架构等

4 ) HTML DOM 树

  • 浏览器中的 HTML 文档对象模型(DOM)就是一个典型的组合模式实例。
  • DOM 节点可以是元素节点(如
    或

    ),也可以是文本节点,它们共同构成了一个树形结构。

  • 开发者可以以统一的方式遍历、修改或操作 DOM 树中的任何节点,不论它是叶节点(文本节点)还是复合节点(元素节点及其子节点)

5 ) 游戏开发

  • 在游戏引擎中,场景可能包含多个实体,这些实体可能是独立的游戏对象,也可能是包含多个子对象的复杂对象,如角色由身体、头部、四肢等部件组成
  • 组合模式允许开发者以一致的方式来处理单个对象的动作、渲染和其他功能,无论对象是否包含子对象

6 ) XML/JSON 数据解析

  • 解析 XML 或 JSON 数据时,文档结构通常包含嵌套的元素或对象
  • 组合模式可以用来构建解析器,使其能以同样的方式处理简单的元素和含有子元素的复杂元素

7 ) 总结来说

  • 组合模式的应用在于它帮助我们构造和管理树形结构的数据和对象,简化了处理复杂层次结构的逻辑
  • 并且降低了客户端代码与结构内部细节之间的耦合度

组合模式不适用场景

  • 组合模式虽然是一种强大的设计模式,但并非所有场景都适合使用它
  • 以下是一些组合模式不适合应用的地方

1 ) 简单的对象结构

  • 如果应用程序中的对象结构相对简单,且不需要复杂的组合和嵌套,那么使用组合模式可能会增加不必要的复杂性
  • 在这种情况下,使用简单的面向对象技术可能就足够了

2 ) 对性能有严格要求

  • 组合模式在处理复杂的对象树时可能会引入一些性能开销,因为需要在运行时遍历和操作这些对象
  • 如果应用程序对性能有非常严格的要求,那么可能需要避免使用组合模式,或者仔细评估其性能影响并采取相应的优化措施

3 ) 需要严格限制对象类型

  • 组合模式允许在对象树中组合不同类型的对象,这提供了很大的灵活性
  • 然而,在某些情况下,可能需要严格限制对象树中允许的对象类型
  • 使用组合模式可能会使这种类型限制变得更加复杂和难以维护
  • 在这种情况下,可能需要考虑使用其他设计模式或技术来实现类型限制

4 ) 不适合频繁变更的结构

  • 如果应用程序中的对象结构经常发生变化,那么使用组合模式可能会导致维护成本增加
  • 因为组合模式通常需要在多个类和方法中处理对象树的遍历和操作,当结构发生变化时,这些代码可能需要进行相应的修改和更新

5 ) 对接口有严格要求的场景

  • 在某些情况下,应用程序可能需要遵循特定的接口规范或协议,而这些规范可能不支持或不适合使用组合模式
  • 在这种情况下,可能需要考虑其他符合接口要求的设计模式或技术

6 ) 需要注意的是

  • 以上只是一些一般性的指导原则,并不适用于所有情况
  • 在实际应用中,是否使用组合模式需要根据具体的应用场景和需求进行权衡和决策
030、自动白平衡AWB实战:灰度世界、完美反射与色温估计的工程实现与局限 本文深入探讨了自动白平衡(AWB)算法在工程实践中的实现与局限性。作者结合实际项目经验,分析了灰度世界算法、完美反射算法和色温估计三种主流方法的优缺点和适用场景,并分享了调试过程中的关键技巧和常见陷阱。文章指出,纯色背景、多光源环境等特殊场景容易导致算法失效,需要通过混合策略和场景检测来优化。作者强调AWB调试需要大量实际场景测试,建议保留手动调节功能,并针对不同硬件配置进行参数标定。最后提出,AWB优化是一个持续迭代的过程,需要工程化的测试方法和数据处理能力。 阅读详情

相关推荐

【AI 编程工具进阶用法】如何在Cursor、Trae等工具中使用Skills

OpenSkills是一个开源项目,用于在Cursor、Trae等AI编程工具中添加可复用、可组合的"能力模块"。安装流程包括:1)全局安装OpenSkills CLI工具;2)选择安装Anthropic官方Skills到项目或全局;3)创建AGENTS.md文件同步Skills;4)在AI工具中调用Skills。此外还介绍了UI/UX Pro Max Skill项目,通过npm安装后可为AI添加设计能力。这些Skills相当于为AI工具安装"高级技能包"

肌肉金轮的博客 3546

瑞_23种设计模式_组合模式

本文章为瑞_系列专栏之《23种设计模式》的组合模式篇。组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 1902

PRIDE数据库20年:2025更新

PRoteomics IDEntifications (PRIDE)数据库(https://www.ebi.ac.uk/pride/)是全球领先的基于质谱(MS)的蛋白质组学数据存储库,也是ProteomeXchange联盟的创始成员之一。本文总结了过去3年中PRIDE资源及相关工具的发展情况。提交到PRIDE存档的数据集数量平均每月达到约534个。主要得益于基础设施的持续改进,如用于超大数据集的新文件传输协议(Globus)、新的数据重新提交流程以及自动数据集验证过程。

多组・学・多组学 2064

设计模式--组合模式【结构型模式】

组合模式又叫作整体-部分模式,它将对象组合成树状的层次结构,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性,是一种结构型模式。

weixin_42118323的博客 1456

【Bug已解决】NCCL timeout for validation 解决方案

训练用多卡 DDP / FSDP 正常,但一到或者进程直接 hang 在 eval 的某个集合通信上。最迷惑的是:训练阶段(有集合通信)完全正常,偏偏 eval 阶段(看起来更轻量)超时。因为 eval 阶段某些 rank 没参与 collective,导致参与的那部分 rank 永远等不到同伴。

一键难忘的博客 142

【考研高数-高等数学-基础】第一章 函数、极限、连续

第一章 函数、极限、连续 第二章 导数与微分 第三章 微分中值定理及导数应用 第四章 不定积分 第五章 定积分与反常积分 第六章 定积分的应用 第七章 微分方程 第八章 多元函数微分学 第九章 二重积分 第十章 无穷级数 第十一章 向量代数与空间解析几何及多元微分学在几何上的应用 第十二章 多元积分学及其应用 难题: 极限的递推 微分中值定理的证明题 定积分的不等式和等式的证明 重积分的不等式和等式的证明 线面积分的不等式和等...

刘鑫磊 2035

设计模式-组合模式(Composite)

组合模式(Composite Pattern),也被称为部分-整体模式、合成模式或对象树,是一种结构型设计模式。这种模式将一组具有相似功能的对象视为一个单一的对象,使得客户可以以统一的方式处理单个对象和组合对象。该模式依据树形结构来组合对象,用来表示部分以及整体层次。在特定的应用场景下,如需要表示的功能的结构可以被抽象成树状结构时,就非常适合使用组合模式。例如,在一个模拟的公司架构中,公司被视为一个整体,它下面可以设有行政部门和IT部门,而这些部门又可以有自己的下属部门。

miaoyl的博客 2372

UDF学习(四)FLUENT UDF-DEFINE_PROFILE宏

利用DEFINE_PROFLILE可以指定以下边界或计算域信息:DEFINE_PROFILE(name,t,i)//既可以用。

weixin_44386973的博客 1806

23种设计模式【结构型模式】详细介绍之【组合模式】

设计模式组合模式允许将对象组合成树状结构,从而能够统一处理个体对象和组合对象。适用于表示层次结构的数据,如文件系统、图形界面组件、组织结构等。组合模式通过将对象组合成树形结构,使客户端可以统一地处理单个对象和组合对象,增强了系统的灵活性和可扩展性。它是一种非常有效的方式来管理和操作层次结构数据,简化了复杂结构的管理。版权声明:原创博主:牛哄哄的柯南[哈哈][抱拳]加油!共同努力!Keafmd牛哄哄的柯南,期待你的三连+关注~~

『愚』的博客 1366

【WRFDA教程第四期】雷达数据同化(Radar Data Assimilation)

雷达数据同化(Radar Data Assimilation)

WW、forever的博客 1761

基于FPGA的时间数字转换(TDC)设计(五:基于Carry4的高精度TDC设计)

基于FPGA的时间数字转换(TDC)设计,此为第五篇:基于Carry4的高精度TDC设计。提供工程文件及MATLAB测试分析代码

sdau2005的博客 8805

【设计模式-结构型】组合模式

组合模式是一种结构型的设计模式,它通过将对象组合成树形结构来表示“整体-部分(树形)”的层次关系,允许客户端统一地对待单个对象和对象组合。

qq_36038282的博客 1249

OV9734 DATASHEET,完整规格书

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

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

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

无敌岩雀的博客 1720

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

设计模式(九)结构型:组合模式详解

组合模式(Composite Pattern)是 GoF 23 种设计模式中的结构型模式之一,其核心价值在于将对象组织成树形结构以表示“部分-整体”的层次关系,并使得客户端可以统一地处理单个对象和组合对象。

谦与谦寻的神隐 1166

【c++设计模式11】结构型3:组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,通过将对象组合成树状结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,可以一致地处理组合对象和叶子对象。

junxuezheng的博客 1327

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

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

charlie114514191的博客 862

C# 设计模式(结构型模式):组合模式

组合模式是一个结构型设计模式,主要用于将多个对象组合成树形结构,以表示“部分-整体”的层次关系。通过组合模式,客户端可以以一致的方式对待单个对象和对象集合,而无需关心它们的具体结构。这使得客户端的代码更加简洁和易于维护。组合模式是一个非常强大的设计模式,尤其适用于处理“部分-整体”结构的场景。通过组合模式,客户端能够以统一的方式对待单个对象和对象集合,从而简化了复杂系统的管理。无论是公司组织结构、文件系统还是图形界面,组合模式都能提供优雅的解决方案。

玉面小浪君的博客 1213

设计模式详解(十一)——组合模式

组合模式(Composite Pattern)是一种结构型设计模式,又叫部分整体模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。在使用组合模式时,要多加考虑方式,有的时候可以与迭代器模式配合使用。组合模式,它是一种非常强大的结构型设计模式,用于创建复杂的对象结构,允许用户以统一的方式处理单个对象和复合对象。通过组合模式,你可以构建出具有层次结构的对象模型,这些对象可以像单个对象一样被简单、一致地使用。组合模式是一种非常普遍和常用的模式,接口服务互相组合,提供更丰富的接口,实现复杂的业务逻辑。

qq_44307209的博客 1326

Java设计模式-结构型模式设计模式-组合模式

Java设计模式-结构型模式设计模式-组合模式

Fatter$hday的博客 948

设计模式之组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它将对象结构(树形结构)中的对象(包括叶子节点和容器节点)都看作同一类型的对象,从而使得客户端可以一致地处理单个对象和对象组合。这种模式使得我们能够将单个对象和对象组合都看作树形结构的一部分,并且可以对整个树进行统一的操作,如遍历、添加、删除等。

Rcain_R的博客 1408

【设计模式】【结构型模式】组合模式(Composite)

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和组合对象,而无需关心它们的具体类型。将对象组织成树形结构,使得对单个对象和组合对象的操作具有一致性。统一处理单个对象和组合对象核心优势:客户端无需区分处理的是叶子节点(单个对象)还是复合节点(组合对象)。案例:在文件系统中,无论是文件(叶子节点)还是文件夹(复合节点),都可以统一调用display()方法展示信息。简化客户端代码。

flzjkl的博客 1411

结构型设计模式之组合模式

组合模式(Composite Pattern)也称为整体-部分(Part-Whole)模式,属于结构型模式。它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户端对单个对象和组合对象的使用具有一致性。

积跬步,至千里。 595

【设计模式】结构型模式(四):组合模式、享元模式

组合模式(Composite Pattern)是一种设计模式,用于处理树形结构的数据。它的主要目的是将对象组合成树形结构来表示 “部分 - 整体” 的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

Data · Model · Agent · Repeat 1331

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

组合模式(Composite Pattern),又叫部分整体模式(Part-Whole Pattern),属于结构型模式的一种,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,是一种对象结构型模式。该模式创建了一个包含自己对象组的树形结构,其提供了修改相同对象组的方式,使得用户对单个对象和组合对象的使用具有一致性。

tszc95的博客 954

结构型设计模式05-组合模式

一天一个设计模式,今天学习组合模式:它可以将一组相似的对象看作一个单一的对象,并在树形结构中组合这些对象,用来表示部分以及整体层次关系。

十二间记,知不足而奋斗,望远山而前行。千里不辞行路远,时光早晚到天涯。 454

Java设计模式:结构型模式→组合模式

Java设计模式:结构型模式→组合模式详解

专注分享技术、实用优质教程、资源 1474
上一篇: consul: 集群搭建和数据中心通信
下一篇: 设计模式: 结构型之享元模式(7)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值