设计模式学习笔记(九)——Composite组合模式

设计模式|组合模式(Composite Pattern) 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示部分-整体的层次结构。这种模式使得客户端能够以统一的方式处理单个对象和组合对象。 阅读详情
设计模式学习笔记(九)——Composite组合模式

       Composite组合模式主要是应对这样的问题:一类具有“容器特征”的对象——即他们在充当对象的同时,又是其他对象的容器的情况。在编写时我们常常会造成:客户代码过多地依赖于对象容器复杂的内部实现,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性的弊端。

       GoF《设计模式》中说到:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得客户对单个对象和组合对象的使用具有一致性。

       Composite组合模式结构如下:



      
说道这,我觉得有一个编程中常见的场景,就是对于树的实现,很符合这个模式。下面我就用这个例子作一下。

       首先,我们先分析对于一棵树所包含的部分,树干、树枝、树叶,其中树干可以看成一个树枝(就是粗了点)。那么我们就应该有两种类实现Leaf(树叶)和Limb(树枝)。对于叶子节点和枝节点的不同在于枝节点有子树,而叶子节点没有子树。为了使单个对象和组合对象的使用具有一致性,我可以将叶子节点想象成没有子树的枝节点。这样我就可以得到一个抽象类,代码如下:

       public abstract class AbstractClass

    {

        public string name;

        public ArrayList list;

        public abstract void Add(AbstractClass item);       //增加一个子节点

        public abstract void Remove(AbstractClass item);    //去掉一个子节点

        public abstract string Print();                     //打印当前节点

    }

       然后,我在对叶子节点和枝节点作不同的实现:

       枝节点:

       public class Limb:AbstractClass

    {

        public Limb()

        {

            list = new ArrayList();

        }

 

        public override void Add(AbstractClass item)

        {

            list.Add(item);

        }

 

        public override void Remove(AbstractClass item)

        {

            if(list.Contains(item))

                list.Remove(item);

        }

        public override string Print()

        {

            Console.Write(name + "/n");

            if(list.Count != 0)

            {

                for(int i = 0;i<list.Count;i++)

                {

                    Console.Write("(Parent is " + name + ")");

                    ((AbstractClass)list[i]).Print();

                }

            }

            return name;

        }

 

    }

    叶子节点:

    public class Leaf:AbstractClass

    {

        public Leaf()

        {

            list = null;

        }

 

        public override void Add(AbstractClass item)

        {

 

        }

        public override void Remove(AbstractClass item)

        {

           

        }

        public override string Print()

        {

            Console.Write(name + ",");

            return this.name;

        }

    }

    对于叶子节点来说,不需要子节点,当然也就不需要添加和删除子节点的方法。

    好,接下来,我们可以在客户程序中组建一棵树,来测试一下:

        static void Main(string[] args)

        {

            AbstractClass Tree = new Limb();

            GetTree(Tree);

            PrintTree(Tree);

            Console.Read();

        }

 

        public static void GetTree(AbstractClass Tree)

        {

            Tree.name = "1";

            AbstractClass leaf2 = new Leaf();

            leaf2.name = "2";

            Tree.Add(leaf2);

            AbstractClass limb3 = new Limb();

            limb3.name = "3";

            Tree.Add(limb3);

            AbstractClass leaf4 = new Leaf();

            leaf4.name = "4";

            limb3.Add(leaf4);

            AbstractClass leaf5 = new Leaf();

            leaf5.name = "5";

            limb3.Add(leaf5);

        }

 

        public static void PrintTree(AbstractClass Tree)

        {

            Tree.Print();

        }

    输出结果如下:

1

(Parent is 1)2,(Parent is 1)3

(Parent is 3)4,(Parent is 3)5,

在组织这个树时,的确能感觉到GoF《设计模式》中的那句话:单个对象和组合对象的使用具有一致性。当然也的确感觉到一点矛盾:对于叶子节点来说,不需要ArrayList和Add()Remove()应该不继承才对,当然如果在代码执行性能可以达到要求的情况下,简化一下编码实现复杂度也是挺好的一件事。

最后在来说说Composite组合模式的几个要点:

       1、Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致的处理对象和对象容器,无需关心处理的是单个对象,还是组合的对象容器。

2、将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的对象接口——而非对象容器的复杂内部实现结构——发生依赖关系,从而更能“应对变化”。

3、Composite模式中,是将“Add和Remove的和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡结构,这又是必须付出的代价。

4、Composite模式在具体实现中,可以让父对象中的字对象反向追溯:如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率 

设计模式(七)组合模式Composite(结构型) 设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面。 例子1:就是多级树形菜单。 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象。我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象。客户端代码必须区别对... 阅读详情

相关推荐

C++设计模式——Composite组合模式

设计模式学习

程序员与背包客_CoderZ 1911

组合模式(Composite)解析例子

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

weixin_33725270的博客 337

2026年数据中心运行与管理专业人才培养基地建设方案(高职、数据中心运行与管理新专业、人才培养、专业代码:510310)

摘要: 为响应国家“东数西算”战略和数字经济需求,我校拟联合行业领军企业建设数据中心运行与管理人才培养基地。项目基于国家政策引导和产业快速发展背景,针对行业10万人才缺口,对标教育部新设专业标准(510310),分三阶段实施五年规划:专业奠基(2026-2028)、内涵深化(2028-2029)、辐射引领(2030-2031)。建设内容涵盖校企协同岗位能力分析、模块化课程开发(如网络管理、自动化运维等)、实训基地搭建及“课证融通”培养模式,重点培养基础设施、网络服务、运维托管三类岗位技能人才,目标建成区域性

啊碧根果的博客 1685

设计模式——合成模式(Composite)

一、功能 合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。 从和尚的故事谈起 这是小时候我奶奶讲的故事:从前有个山,山里有个庙,庙里有个老和尚在给小和尚讲故事,讲的什么故事呢?从前有个山,山里有个庙……。奶奶的故事要循环多少次,根据你多长时间睡着而定。在故事中有山、有庙、有

晴天的专栏 2800

Quartus II设计程序计数器PC、由PC产生ROM的地址(含仿真)

设计程序计数器PC,正常工作模式下,系统启动,设置PC的初始值,之后每来一个clk,PC的输出值应该增加1;当程序发生跳转时,PC的值应该发生改变,级将跳转的地址值赋进行输出。PC后端连接一个ROM,由PC来产生ROM的地址,仿真进行验证。

m0_73700621的博客 1815

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

结构型模式——组合模式(Composite)

开头   今天我们学习一下组合模式,一说到组合两个字你会想到什么呢?UML关系中的组合关系?图片和拼图?文件夹和文件?列表和节点?在学习组合模式之前我觉得很有必要复习一下组合关系和聚合关系的区别?  组合关系:整体和部分的关系,有了整体才有部分,部分不能脱离整体存在。       例子:列表可以包含0或多个节点,一个节点只属于一个列表。一个文件夹里面可以创建文件,一个文件只属于这个文件夹里面。(有...

有道无术,术尚可求,有术无道,止于术。 5788

高效搭建微信公众号爬虫全流程

微信公众号爬虫系统成功完成功能测试验证。该系统具备完整的数据采集与管理能力,支持多公众号内容爬取、数据存储与统计分析。通过命令行界面可执行爬取操作(如量子位、新智元等公众号),查看最新文章列表和系统统计信息。测试显示SQLite数据库正常存储数据,所有核心功能(多源支持、文章检索、数据统计)均运行良好。系统采用模块化设计,扩展性强,为后续接入真实API或网页爬取奠定了坚实基础,是AI内容聚合的优质开发平台。🎉

weixin_44975687的博客 1553

设计模式总结之Composite Pattern(组合模式)

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

cooldragon的专栏 6607

PostgreSQL高可用之主备复制

多个PostgreSQL可协同工作,如果主库发生宕机备库将迅速进行接管并对外提供服务以实现高可用。本文将从主备复制、主备切换、故障转移等角度进行实际测试演练。第一章主备复制是基础,通过主备复制可以得到一个或多个相同的实例。在主备复制的基础上通过第二章主备切换介绍了如何手工将主库与备库互换角色。在第三章中,采用了Keepalived进行实时监测,在主库宕机后,使用主备切换中提到的命令使备库升级为主库并对外提供服务,以达到PostgreSQL高可用的目标。

asdasdsaff的博客 1347

【N32L40X】学习笔记08-定时器的基本定时功能-超时功能

【代码】【N32L40X】学习笔记08-定时器的基本定时功能-超时功能。

Car12 827

【转帖】设计模式学习笔记(九)——Composite组合模式

设计模式学习笔记(九)——Composite组合模式【原文】http://kid-li.cnblogs.com/archive/2006/06/02/416038.html        Composite组 合模式主要是应对这样的问题:一类具有“容器特征”的对象——即他们在充当对象的同时,又是其他对象的容器的情况。在编写时我们常常会造成:客户代码过多 地依赖于对象容器复杂的内部实现,

niushangtian的专栏 394

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式学习笔记九(Composite组合模式)

动机:客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非对象接口)的变化将引起客户端代码的频繁变化,带来代码的维护性、扩展性等弊端。如何实现“客户代码与复杂的对象容器结构”进行解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像使用简单对象一样来处理复杂的对象容器。意图:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对

Erictianya的专栏 614

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【设计模式学习笔记九】【结构型模式】【组合模式(Composite)】

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构;使得用户对单个对象和组合对象的使用具有一致性。又称“整体-部分“模式。 1)能够画出这个设计模式的架构框图; 2)能够根据架构框图写出对应的伪代码; 3)这个模式的应用场景,主要优缺点。

seaicelin的博客 844

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

miaoyl的博客 2372

组合模式(CompositePattern)

定义 组合多个对象形成树形结构以表示“整体-部分”的关系的层次结构。组合模式对叶子节点和容器节点的处理具有一致性,又称为整体-部分模式。 结构图 角色与理解 组合模式共分为三种角色: Component(抽象构件):叶子构件与容器构件共同继承的父类或者是共同实现的接口,该角色中包含所有子类共有方法的声明和实现,在抽象构件中定义了管理子构件的方法,新增构件、删除构件、获取构件。 Leaf(叶子构件):表示叶子节点,没有子节点,对于继承父类的管理子节点的方法以抛出异常的方式处理。 .

码农架构 3610

设计模式第13讲——组合模式(Composite)

组合模式也成为整体部分模式,是一种结构型设计模式。一、什么是组合模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图 5.1 Expression-组件(Component)5.2 Number-叶子节点(Leaf)5.3 Operation-组合节点(Composite)5.4 testComposite六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 5715

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

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

ProgramNovice的博客 1195

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

本文介绍了组合模式的设计思想及其应用。组合模式通过将对象组织成树形结构,统一处理容器对象和叶子对象,使得用户可以一致地操作整体和部分。文章详细说明了组合模式的结构(抽象构件、叶子节点、容器节点),并以文件系统为例展示了具体实现。组合模式的优点包括使用简单、适合树结构、易于扩展,但也存在接口不一致等缺点。文中还对比了组合模式与装饰模式、外观模式的区别,列举了Java Swing等典型应用场景,并强调组合模式的核心是统一接口而非单纯套娃结构。该模式适用于目录、菜单等层次型数据结构。

经天纬地,格物致理 1232

设计模式-组合模式-Composite Pattern

组合模式(Composite Pattern)是一种结构型设计模式,它主要用于将对象组合成树形结构,以表示“部分-整体”的层次关系。这种模式使得用户可以统一地对待单个对象和组合对象。组件(Component):叶节点(Leaf):Composite:客户端(Client):首先,定义组件接口: 接着,创建叶节点类: 然后,定义组合类: 最后,客户端代码使用组合模式: 1.3.组合模式的应用场景 文件系统:组织结构:GUI组件:文档编辑器:分布式系统:组合模式提供了一种灵活的方式来管理层次结构中的对象,使

wesigj的博客 1654
上一篇: 设计模式学习笔记(八)——Bridge桥接模式
下一篇: 设计模式学习笔记(十)——Decorator装饰模式
zhy05
博客等级 码龄21年 21粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值