设计模式与实例代码:Composite模式

23种设计模式-组合(Composite)设计模式 软考中级-软件设计师 组合模式 阅读详情

意图/定义:将对象组合成树形结构以表现“整体/部分”层次结构,组合可以让客户以一致的方式处理个别对象以及对象组合。

问题:你想表示对象的部分/整体层次结构或者需要忽略组合对象与单个对象的不同

解决方案:

参与者和协作者:在Composite中用来存储部件实现Component接口中实现的有关操作

效果:组合模式解耦了客户程序与复杂元素内部结构

实现:




示例代码,以公司的结构为例,一个公司可能由多个单个人以及一些部门组成。现在我们需要了解公司的人员组成情况,可我们又不希望去了解公司各个部门内部或这些个人的组织情况,我们为个人、部门到公司都提供一个输出本单元内详情的接口以达到这人目的。

using System;
using System.Collections.Generic;

namespace Composite
{
    /// <summary>
    /// MainApp startup class for Structural
    /// Composite Design Pattern.
    /// </summary>
    class MainApp
    {
        /// <summary>
        /// Entry point into console application.
        /// </summary>
        static void Main()
        {
            // Create a tree structure
            Composite company = new Composite("MicroSoft");
            company.Add(new Leaf("CEO"));
            company.Add(new Leaf("CTO"));

            Composite department = new Composite("Windows 8 Development Dep");
            department.Add(new Leaf("Department Leader"));
            department.Add(new Leaf("Department Member"));

            company.Add(department);
            company.Add(new Leaf("CFO"));

            // Add and remove a leaf
            Leaf temp_worker = new Leaf("UFO");
            company.Add(temp_worker);
            company.Remove(temp_worker);

            // Recursively display tree
            company.Display(1);

            // Wait for user
            Console.ReadKey();
        }
    }

    /// <summary>
    /// The 'Component' abstract class
    /// </summary>
    abstract class Component
    {
        protected string name;

        // Constructor
        public Component(string name)
        {
            this.name = name;
        }

        public abstract void Add(Component c);
        public abstract void Remove(Component c);
        public abstract void Display(int depth);
    }

    /// <summary>
    /// The 'Composite' class
    /// </summary>
    class Composite : Component
    {
        private List<Component> _children = new List<Component>();

        // Constructor
        public Composite(string name) : base(name)
        {
        }

        public override void Add(Component component)
        {
            _children.Add(component);
        }

        public override void Remove(Component component)
        {
            _children.Remove(component);
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);

            // Recursively display child nodes
            foreach (Component component in _children)
            {
                component.Display(depth + 2);
            }
        }
    }

    /// <summary>
    /// The 'Leaf' class
    /// </summary>
    class Leaf : Component
    {
        // Constructor
        public Leaf(string name) : base(name)
        {
        }

        public override void Add(Component c)
        {
            Console.WriteLine("Cannot add to a leaf");
        }

        public override void Remove(Component c)
        {
            Console.WriteLine("Cannot remove from a leaf");
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);
        }
    }
}


【Unity】【模型】【AI建模】如何将AI生成的GLB格式3D模型文件导入Unity 本文介绍了一个将AI工具自动生成的GLB格式3D模型文件转换成fbx模型文件导入Unity的步骤。 阅读详情

相关推荐

【隐私计算】从本地加法到在线乘法:Beaver Triple如何重塑算术秘密分享的运算效率

本文深入探讨了Beaver Triple在算术秘密分享中的关键作用,显著提升了隐私计算中的乘法运算效率。通过对比加法与乘法的实现差异,详细解析了Beaver Triple的预处理机制和在线计算优化,展示了其在减少通信量和计算时间方面的革命性突破。

weixin_29227585的博客 436

组合模式(Composite)解析例子

组合模式属于结构型模式,其意图是将对象组合成树形结构以表示部分-整体的层次结构,composite模式使得用户对单个对象和组合对象的使用具有一致性。Composite模式的一个重要思想是递归组合,关键是一个抽象类,它既可以代表组合对象,又可以代表一个被组合的对象。经常在Java开发中遇到的容器就使用了组合模式,一方面组件可以放在容器中,另一方面容器也可以作为组件放在另外的容器...

weixin_33725270的博客 337

达梦数据守护集群监视器详解与应用指南

主库/备库:承担读写和只读服务的数据节点Redo 日志:记录数据库变更的核心日志Redo 日志传输:主备库间的日志同步机制Redo 日志重演:备库重做日志的应用过程守护进程 (dmwatcher):实例级别的监控和管理组件监视器 (dmmonitor):集群级别的监控和管理工具监视器作为数据守护系统的重要组成部分,提供了集群监控、故障管理和状态确认等关键功能。达梦数据守护集群监视器是维护数据库高可用性的关键工具。

huanhuanzhou blog 1058

部分-整体(树结构) -- 组合模式 (Composite) 介绍 使用场景案例 优缺点 及代码演示

一句话概括: 对象A里面又包含List<A>的一个树状结构。 补充介绍: 组合模式(Composite Pattern)创建了一个包含自己对象组的类。该类提供了修改对象组的方式。 组合模式将对象组合成属性结构以表示“部分-整体”的层次结构(树形结构)。组合模式使得用户单个对象和组合对象的使用具有一致性。 参与角色: 1)组合类 (包括该类自己的属性以及一个元素为类本身的Li...

一只猿的自我修养 2676

三种1:4传输线变压器巴伦的分析

满足多模多馈天线系统匹配要求的传输线变压器巴仑有:双线传输线变压器( 见图1) 、三线传输线变压器( 见图4) 和四线传输线变压器( 见图5) 。尽管3 者的结构不同, 但都可实现1∶4 阻抗变换和不平衡-平衡转换。下面就应用电报方程对它们的阻抗变换特性和输出平衡特性进行分析。

weixin_42407808的博客 8042

GD32F4系列定时器正交译码器实战:用TIMER1读取旋转编码器信号(附完整代码)

本文详细介绍了GD32F4系列定时器正交译码器的实战应用,重点讲解如何使用TIMER1模块高效读取旋转编码器信号。内容涵盖硬件连接、定时器配置、方向判断与速度计算等关键环节,并提供了完整的代码实现和优化建议,帮助开发者快速掌握GD32微控制器在工业控制和消费电子领域的编码器接口设计。

weixin_29169505的博客 201

Composite 模式

Composite 模式 能够使容器与内容具有一致性,创造出递归结构的模式就是Composite模式。 示例程序类图 示例程序 Entry public abstract class Entry { public abstract String getName(); // 获取名字 public abstract int...

stepMore的博客 3168

基于Mask-RCNN网络的书架图书书脊分割和检测(含代码)

图书馆的书架上的图书书脊分割/检测对于图书书名等信息的识别具有重要意义,因此,该博客基于Mask-RCNN网络实现了图书书脊的分割和检测,有利于进一步利用ocr文字识别技术实现图书书名等信息的入库。如下图所示,为书架原始数据和分割/检测后的结果。(本文已训练模型,无需训练)

qq_44619530的博客 2025

Android中的设计模式

总结Android框架中出现的设计模式。

陆业聪 1589

机器学习分类算法之XGBoost(集成学习算法)

目录 走进XGBoost 什么是XGBoost? XGBoost树的定义 XGBoost核心算法 正则项:树的复杂程度 XGBoost与GBDT有什么不同 XGBoost需要注意的点 XGBoost重要参数详解 调参步骤及思想 XGBoost代码案例 相关性分析 n_estimators(学习曲线) max_depth(学习曲线) 调整max_depth 和min_child_weight 调整gamma 调整subsample 和colsample_bytree 调整正则

迷茫与徘徊只会让你陷入绝境,欢迎私信博主,带你开始提升变现价值! 11万+

IEC61850规约客户端软件开发实战(第二章)

本文介绍了基于IEC61850规约的客户端软件开发过程,重点阐述功能界面设计和服务端连接功能的实现。界面采用Qt框架设计,包含功能按钮区、数据模型展示区(使用QTreeWidget)和状态显示区。连接功能通过libiec61850开源库实现,详细说明了连接流程、句柄创建及状态管理的代码实现。测试结果表明系统能正确识别连接状态,并通过界面直观显示。文章为IEC61850规约软件开发提供了实用参考,下期将分享规约模型数据加载的实现过程。

半青年的博客 2855

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

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

ProgramNovice的博客 1195

Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)

大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。

cpp加油站的专栏 518

设计模式 —— Composite 模式

设计模式之组合模式分析。组合模式示例、适用场景。

一步一步往上爬 2266

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

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

【设计模式】Composite

目录前言安卓View的实现ViewBeyond setContentViewsetContentView做了什么事情?如何将xml文件变成对象的?小结View的绘制流程三个流程三个过程如何触发MeasureLayoutDrawComposite设计模式measure, layout, draw的调用总结参考链接 前言 Composite设计模式,将物体组合成一个树结构,让单个对象和组合对象使用起来都一样,组合对象负责将实际的操作分发给每一个组件。 这篇博文分析了安卓的View相关的类,它们可以说是...

gman344的博客 590

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

23种设计模式之Composite模式

目录第二部分:结构型模式1. Composite模式2. 结构图3. 实例 第二部分:结构型模式 1. Composite模式 在开发中,我们经常可能要递归构建树状的组合结构,Composite模式则提供了很好的解决方案。 2. 结构图 3. 实例 client #include "composite.h" #include "leaf.h" int main() { // 创建一个树形结构...

m0_37604894的博客 506

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

设计模式之 Composite(组合)通俗理解

1 Composite 模式定义 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。 Composite 比较容易理解,想到 Composite 就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite 将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。 所以 Composite 模式使用到 Iterator 模式,和 Chain of Res

码灵的博客 874

設計模式之Composite(組合)

Composite定義:將物件以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得用戶端對單個物件和組合物件的使用具有一致性。 Composite比較容易理解,想到Composite就應該想到樹形結構圖。組合體內這些物件都有共同介面,當組合體一個物件的方法被呼叫執行時,Composite將遍曆(Iterator)整個樹形結構,尋找同樣包含這個方法的物件並實現呼叫執行。可以用牽一動百來形容。

!Java 2993

【C++设计模式】第四篇:Composite 模式(组合实体模式)- 树形结构的优雅处理方案

摘要:C++组合模式(Composite Pattern)解析 组合模式是一种结构型设计模式,用于处理树形结构对象,将对象组合成树形结构表示"整体-部分"层次关系。它通过抽象组件(Component)、叶子节点(Leaf)和组合节点(Composite)三个角色实现统一操作接口,使客户端能一致对待单个对象和组合对象。典型应用场景包括文件系统、GUI组件、组织结构等树形结构。代码示例展示了如何实现组件基类、叶子节点和包含子节点的组合节点,通过递归操作处理树形结构。组合模式的优点在于简化客户

宁静致远的博客 736

设计模式11——Composite设计模式

Composite组合设计模式属于对象的结构模式,有时又叫做部分-整体(Part-Whole)模式。  组合设计模式将对象组织到树型结构中,可以用来描述整体与部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。  组合设计模式涉及到的三个角色  (1).抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象规定一个接口。这个角色给出共有的接口机器默认行为。  (

Tony Chen的专栏 1817

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

Composite(组合模式)是一种管理树形结构的抽象方式。其是将对象组合成树形结构,从而构成表示“部分 - 整体” 的层次结构。这种层次关系在日产生活中十分常见。如在公司组织关系中,可能分为部门与人,其中人属于部门,有的人有下属,有的人没有下属。假如将部门、人等都抽象成为一个节点(不用关心当前节点是部门还是人,两者有公共的基类),这样的话公司的组织架构就十分清晰,而且某个部门下有多少人、财务数据等这些数据也容易统计。除了公司外,在操作系统中也普遍应用,其中的文件夹与文件。

sinat_42974726的博客 539

图解设计模式之Composite模式

composite模式,组合模式

weixin_45820190的博客 400

设计模式笔记(5 COMPOSITE & DECORATOR)

COMPOSITE(组合)适用性:1.想表示对象的部分整体层次结构2.希望用户忽略组合对象和单个对象的不同。思考:组合模式的所有组件应该具备同一个接口。一直感觉,这种组合是一种递归组合的概念。所有的组件,按照树的结构组织起来,树的叶结点行为可能和中间结点的行为并不一致,这看上去违背了Liskov原则,似乎是一个容易引起迷惑的地方。树的叶结点可能并不能增加子结点,删除子结点的行为也可能失败。而一个中

不亦快斋 2252

图解设计模式(十一)Composite 模式

读书笔记 仅供参考 简述 Composite 是混合物,复合物的意思。类似与“文件夹”的概念,文件夹当中可以放文件也可以放文件夹,文件夹形成了一种容器结构、递归结构,有时文件和文件夹当作同一种对象看待。 Composite 模式就是创造这样结构的模式。能够使容器与内容具有一致性,创造出递归结构。 UML 和角色 Leaf 表示“内容”的角色,在该角色中不能放入其他对象,就像一个文件 Composite 表示容器的角色,可以在其中放入 Leaf 和 Composite 角色,类似文件夹 Co.

zhangmiaoping23的专栏 319

【笔记整理】图解设计模式 | 第11章 Composite模式(容器与内容的一致性)

【笔记整理】图解设计模式 | 导航 定义 能够使容器与内容具有一致性,创造出递归结构的模式就是Composite模式。 Composite模式中的登场角色 Leaf(树叶)        表示“内容”的角色。在该角色中不能放入其他对象。 Composite(复合物)        表示容器的角色。可以在其中放入Leaf角色和Composite角色。 Component(一致性)   ...

372

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

概念 Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。 动机 在软件在某些情况下,客户代码过多的依赖于对象容器复杂的内部实现结构,对象容器内部实现结构的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端 如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器? Component (树形结构的节点抽象) 为所有的对象定义统一的接

weixin_45606518的博客 533
上一篇: 设计模式实例与代码:Builder模式
下一篇: 程序员的思维修炼-开发认知潜能的九堂课之思维导图
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值