设计模式——组合模式

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

COMPOSITE组合

1、 意图

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

2、 适用性

在下面情况下可以使用Composite模式

  •  想表示对象的整体-部分层次结构
  • 希望用户忽略组合对象与单个对象的不同,用户将同一使用组合结构中的所有对象。

3、 结构

4、 参与者

        Component

                  ——为组合中的对象声明接口。

                  ——在适当的情况下,实现所有类共有接口的缺省方法。

                  ——声明一个接口用于访问和管理Component的子组件。

                  ——(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

         Leaf

                   ——在组合中表示叶节点对象,叶节点没有子节点。

                   ——在组合中定义图元对象的行为。

         Composite

                   ——定义有子部件的那些部件的行为。

                   ——存储子部件。

                   ——在Component接口中实现与子部件有关的操作。

         Client

                   ——通过Component接口操作组合部件的对象。

5、 协作

用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。

6、 效果

1)   定义了包含基本对象和组合对象的类层次结构;基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断递归下去。在客户代码中,任何用到基本对象的地方都可以使用组合对象。

2)  简化客户代码;客户可以一致地使用组合结构和单个对象。通常用户不知道(也不关心)处理的是一个叶节点还是一个组合组件。这就简化了客户代码,因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。

3)  使得更容易增加新类型的组件;新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需要因新的Component类而改变。

4)  使你的设计更一般化;容易增加新组件也会产生一些问题,那就是很难限制组合中的组件。有时你希望一个组合只能有某些特定的组件。使用Composite时,你不能依赖类型系统施加这些约束,而必须在运行时刻进行检查。

7、 实现

下面是使用Component模式时所以考虑的实现问题:

1)  显式的父组件引用;保持从子部件到父部件的引用能简化组合结构的遍历和管理。

2)  共享组件;共享组件是很有用的,如它可以减少对存贮的需求。但是当一个组件只有一个父组件时,很难共享组件。一个可行的解决方法是为子部件存贮多个父部件,但当一个请求在结构中向上传递时,这种方法会导致多义性。

3)  最大化Component接口;Composite模式的目的之一是使得客户不知道他们正在使用的具体的Leaf和Composite类。为了达到这一目的,Composite类应为Leaf和Composite类尽可能多定义一些公共操作。

4)  声明管理子部件的操作;即在安全性和透明性之间的选择

5)  子部件排序;可以用Iterator模式进行。

6)  使用高速缓冲存贮改善性能;如果需要对组合进行频繁的遍历或查找,Composite类可以缓冲存储对它的子节点进行遍历或查找的相关信息。

8、 代码示例

Component

package com.examples.pattern.component;


/**
 *	抽象的组件对象,为组合中的对象声明接口,实现接口的缺省行为
 */
public abstract class Component {
	
	
	/**
	 * 子组件对象的一些操作
	 */
	public abstract void someOperation();
	
	/**
	 * 向组合对象中加入组件对象
	 * @param child	被加入组合对象中的组合对象
	 */
	public void addChild(Component child){
		throw new UnsupportedOperationException("对象不支持这个功能");
	}
	
	/**
	 * 向组合对象中移除某个组件对象
	 * @param child	被移除组合的对象
	 */
	public void remove(Component child){
		throw new UnsupportedOperationException("对象不支持这个功能");
	}
	
	/**
	 * 返回某个索引对应的组件对象
	 * @param index	需要获取的组件对象的索引,索引从0开始
	 * @return	索引对象的组件对象
	 */
	public Component getChildren(int index){
		throw new UnsupportedOperationException("对象不支持这个功能");
	}

}
Composite
package com.examples.pattern.component;

import java.util.ArrayList;
import java.util.List;

/**
 *	组合对象,通常需要存储子对象,定义有子部件的部件行为
 *	并实现在Component里面定义的与子部件有关的操作
 */
public class Composite extends Component {
	
	/**
	 * 用来存储组合对象中包含的子组件对象
	 */
	private List<Composite> childComponents = null;

	@Override
	public void someOperation() {
		if(childComponents != null){
			for(Component c : childComponents){
				c.someOperation();	//递归地进行子组件相应方法的调用
			}
		}

	}

	@Override
	public void addChild(Component child) {
		if(childComponents == null){
			childComponents = new ArrayList<Composite>();
		}
		childComponents.add(this);
	}

	@Override
	public void remove(Component child) {
		if(childComponents != null){
			childComponents.remove(child);
		}
	}

	@Override
	public Component getChildren(int index) {
		
		if(childComponents != null){
			if(index >= 0 && index < childComponents.size()){
				return childComponents.get(index);
			}
		}
		
		return null;
	}
	
	

}
Leaf
package com.examples.pattern.component;

/**
 *	叶子对象,叶子对象不再包含其他子对象
 */
public class Leaf extends Component{

	@Override
	public void someOperation() {
		
	}

}
Client
package com.examples.pattern.component;

public class Client {
	
	public static void main(String[] args) {
		
		//定义多个Composite对象
		Component root = new Composite();
		Component c1 = new Composite();
		Component c2 = new Composite();
		
		//定义多个叶子对象
		Component leaf1 = new Leaf();
		Component leaf2 = new Leaf();
		Component leaf3 = new Leaf();
		
		//组合成树形的对象结构
		root.addChild(c1);
		root.addChild(c2);
		root.addChild(leaf1);
		c1.addChild(leaf2);
		c2.addChild(leaf3);
		
		Component o = root.getChildren(1);
		System.out.println(o);
	}

}



 


【Java设计模式】Java设计模式之(二十一)组合模式(Composite Pattern) 本文目录 一、组合模式介绍 1.1 含义 1.2 适用场景 1.3 主要解决 1.4 应用实例 1.5 优缺点 二、组合模式实现 2.1 类图 2.2 角色分析 2.3 代码实现 三、源码分析 这种类型的设计模式属于结构型模式。 一、组合模式介绍 1.1 含义 组合模式(Composite Pattern),也叫合成模式,又可以叫部分-整体模式(Part-Whole),是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的 阅读详情

相关推荐

STM32基于软件模拟IIC进行AHT21B温湿度采集

通过学习软件IIC来进行实操AHT21B采集温湿度。

Liu-FE的博客 3700

基础笔记(二):设计模式摘录

前言 收录一些自己在开发过程中比较常用的模式,整理出来以便自己复习,毕竟熟才能生巧,才能变通,举一反三。 设计模式在大多数灵活性好、可扩展性高、可移植的优秀程序中都有运用,比如界面展现层运用的MVC模式的主要关系就是由Observer(View-Model)、Composite(CompositeView嵌套视图)和Strategy(View-Controller)三个...

weixin_34360651的博客 143

腾讯游戏安全组件运行异常的全面解决方案

在使用腾讯游戏时,玩家可能会遭遇游戏安全组件运行异常的问题,这不仅影响游戏的正常启动,还可能在游戏过程中引发一系列问题。本文将详细介绍解决腾讯游戏安全组件运行异常的几种方法,帮助玩家重拾游戏乐趣。腾讯游戏安全组件运行异常是一个复杂的问题,可能涉及服务设置、游戏更新、系统环境优化以及硬件与驱动检查等多个方面。最后,希望本文能帮助玩家顺利解决腾讯游戏安全组件运行异常的问题,让玩家能够无忧无虑地享受游戏带来的乐趣。首先,我们需要从系统的服务管理入手,检查与游戏安全组件相关的服务是否正常运行。

nntxthml的博客 5807

【Python设计模式17】组合模式

pass组合模式是一种结构型设计模式,通过将对象组合成树形结构来表示“部分-整体”的层次结构,使得客户端可以统一地处理单个对象和对象组合。组合模式适用于表示部分-整体层次结构、统一处理单个对象和组合对象以及构建递归结构的场景。合理应用组合模式,可以提高系统的灵活性和可扩展性,简化客户端代码。理解并掌握组合模式,有助于在实际开发中构建高效、灵活的系统。

weixin_55252589的博客 587

C#安装OpenCv及打开笔记本默认摄像头方法

C#安装OpenCv及打开笔记本默认摄像头方法

cg1135217680的博客 2572

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1904

设计模式学习笔记十七:组合模式(Composite Pattern)

     1.概述      组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。      组合模式(Composite Pattern):将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。      组合...

weixin_33883178的博客 155

高通Sensor Tuning实战:手把手教你用Chromatix生成并打包bin文件(附避坑指南)

本文详细介绍了高通Sensor Tuning的全流程实战,从Chromatix配置到Bin文件加载验证。通过手把手教程,帮助开发者掌握Chromatix工具链的使用,避免常见配置错误,提升调试效率。特别针对kalama等新一代平台,提供经过验证的解决方案和避坑指南。

ios99的博客 483

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

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

miaoyl的博客 2372

(目录)微气候模型ENVI-met模拟的基本使用教程

ENVI-met模拟操作系列(一) 介绍:

ysqzhatian的博客 2万+

YOLOv8首发优化:遥感目标检测 | 专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块,解决低空间分辨率、传感器噪声、目标模糊、低光照退化和部分遮挡等限制

一种轻量级网络,其创新性地整合了专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 488

设计模式第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

YOLOv5改进有效涨点目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好本专栏自开设两个月以来已经更新改进教程60余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv8文档并不能在优快云上传(所有的创新点都经过我的测试是可用的,得到该文件之后大家可以随意组合使用),所以会建立群的形式在内上传我的文件和视频我也会在群内不定期和大家交流回答大家问题,同时定期会更新一些文章的创新点(经过我融合测试后的,先到先得)。本专栏持续更新网络上的所有前沿文章。

Snu77的博客 3万+

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

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

wesigj的博客 1654

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

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

设计模式组合模式(CompositePattern)

核心模块:抽象构件、树叶构件、容器构件 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:树形结构或者希望一致对待整体和部分; 优点:能够很好的分层,模糊整体和部分的差异,容器对象很容易扩展; 缺点:如果复杂对象很复杂,叶子对象将有很多空方法; 注意: 1,核心就是简单对象和复杂对象实

didiao11300的专栏 261

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形结构,其中顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含更多的树枝节点和叶子节点。这种结构使得客户端可以统一地处理单个对象和组合对象,无需关心它们的具体类型。

m0_51176516的博客 1574

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

您的设计模式——组合模式【Composite Pattern 】

大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上 学那会儿这一章节是必考内容,左子树,右子树,什么先序遍历后序遍历什么,重点就是二叉树的的遍历, 我还记得当时老师就说,考试的时候一定有二叉树的构建和遍历,现在想起来还是觉的老师是正确的,树 状结果在实际项目应用的非常广泛。 咱就先说个最常见的例子,公司的人事管理就是一个典型的树状结构,你想想你公司的结构

613

设计模式之组合模式

组合模式 组合模式(Composite Pattern),又叫整体部分模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。 组合模式依据树形结构来组合对象,用来表示部分以及整体层次,组合模式使得用户对单个对象和组合对象访问具有一致性,即:组合能够让客户以一致的方式处理个别对象以及组合对象。这种设计模式属于结构型模式。 组合模式的三个角色 抽象构件(Component)角色:这是组合中对象声明接口, 在适当情况下, 实现所有类共有的接口默认行为,用于访问和管理 Compone

JustToFaith 2954

设计模式 17 组合模式 Composite Pattern

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。它允许你将对象组合成树形结构,以表示“部分-整体”层次关系。

jxusthusiwen的专栏 1382

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

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

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

C++设计模式——组合模式(Composite Pattern)

C++设计模式——组合模式 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——组合模式目录定义定义结构代码示例总结使用场景及注意事项优缺点参考资料 定义 定义 Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly. 将对象组合成树形结

leonardohaig的博客 1587

python 设计模式之组合模式Composite Pattern

#引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件。 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象。 这是一个树形结构 咱们生活工作中常用的一种结构 文件是一个简单对象,我直接打开就可以使用。文件夹是复杂对象,因为里面还有子文件夹 或者是文件。 我在用这个文件夹的时候,我用相同的方式对待文件夹和文件。 其实...

weixin_30797027的博客 304

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

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

TechNomad的博客 1405

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

组合模式是一种结构型设计模式,用于将对象组织成树形结构以表示"部分-整体"的层次关系。它允许客户端统一处理单个对象和组合对象,无需关心具体差异。该模式包含组件接口(Component)、叶子节点(Leaf)和组合节点(Composite)三个主要角色,适用于文件系统、图形界面等层次结构场景。实现方式包括经典组合模式(统一接口)和安全组合模式(分离接口),前者提供透明性但可能抛出异常,后者更安全但客户端需要区分对象类型。典型应用包括文件系统管理、GUI组件、组织结构表示等。

d3y1`5 81_09 1038

【C#设计模式】9.组合模式(Composite Pattern)【结构型】

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

星Yeah 的博客 2971

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

这种结构通常包含多个层次,每个层次上的对象可以是一个独立的实体(叶节点),也可以是一个包含其他对象的容器(组合节点)。组合模式提供了一种优雅的方式来组织和操作层次结构中的对象,使得客户端可以在不知道对象具体类型的情况下操作对象集合。当希望在不同类型的对象之间提供一致的接口时,组合模式可以确保所有的对象(无论是叶子还是组合节点)都遵循相同的接口定义。当客户端代码需要以一致的方式处理单个对象和组合对象时,组合模式可以让客户端无需关心处理的是单个对象还是组合对象。客户端可以一致地对待单个对象和组合对象。

ling_zhi_xin的博客 1589
上一篇: Eclipse加载全部的Ext卡死解决方法
下一篇: 设计模式——模板方法
HingKwan
博客等级 码龄17年 51粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值