设计模式之组合模式

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

什么是组合模式

    组合模式是指组合多个对象形成树形结构以表示具有"整体-部分"关系的层次结构。组合模式对单个对象和组合对象的使用具有一致性。
    组合模式包括以下几个角色:
        Component(抽象构件):可以是接口或者抽象类,为叶子构件对象或容器构件对象声明接口,该角色中可以包含所有子类共有行为的声明和实现。
        Leaf(叶子构件):实现了抽象构件中声明的方法,该对象没有下级对象。
        Composite(容器构件):该角色包含下级对象。下级对象即可以是叶子构件也可以是容器构件,提供了一个集合用于存储子节点,实现了在抽象构件中定义的方法。
    组合模式的关键是定义一个抽象构件类,他即表示叶子构件也表示容器构件。客户端对抽象构件进行编程,可以对叶子和容器构件进行统一处理。
    在使用组合模式时,可以根据抽象构件类的定义形式将组合模式分为透明组合模式和安全组合模式:
        透明组合模式:在抽象构件类中声明所有管理成员对象的方法,确保所有的子类都有相同的方法。透明组合模式的缺点是不够安全,因为叶子对象和容器对象本质上是不一样的,叶子对象不会有下级对象,所以实现抽象构件中的方法毫无意义。
        安全组合模式:在抽象构件类中不会声明任何管理成员对象的方法,而是在组合构件中声明并实现,这样叶子对象就不需要管理这些方法。安全组合模式的缺点是不够透明,因此叶子构件和组合构件具有不同的方法,而容器构件中用于管理成员对象的方法没有在抽象构件中声明。
    组合模式是使用面向对象的思想来实现树形结构的构建与处理,描述了如何将容器对象和叶子对象进行递归组合,实现简单,灵活性好。

组合模式的优缺点

优点
  1. 组合模式可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次,客户端可以忽略层次的差异,方便的对整个层次结构进行控制。
  2. 客户端对组合结构或单个对象可以统一处理。
  3. 在组合模式中新增容器构件或叶子构件无需修改代码,符合开闭原则。
  4. 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象饿递归组合,可以形成复杂的树形结构,但对树形结构的控制非常简单。
缺点
  1. 在增加新的构件时很难对容器中的构件类型进行限制,使用组合模式时,不能依赖类型来增加约束,因为他们都有相同的抽象层,在这种情况下,必须通过在运行时进行类型检查实现,这个过程实现较为复杂。

组合模式的应用场景

  1. 在具有"整体-部分"的层次结构中,希望通过一种方式忽略"整体-部分"的差异。
  2. 需要处理一个树形结构。
  3. 能够分离出叶子对象和容器对象,而且类型不固定,需要增加一些新的类型。

组合模式的案例

// 抽象构件
@Data
public abstract class OrganizationComponent {

    private String name;
    private String des;

    protected void add(OrganizationComponent organizationComponent) {
        throw new UnsupportedOperationException();
    }

    protected void remove(OrganizationComponent organizationComponent) {
        throw new UnsupportedOperationException();
    }

    public OrganizationComponent(String name, String des) {
        super();
        this.name = name;
        this.des = des;
    }

    protected abstract void print();

}

// 容器构件
public class University extends OrganizationComponent {

    List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();

    public University(String name, String des) {
        super(name, des);
    }

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    protected void print() {
        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

}
public class College extends OrganizationComponent {

    List<OrganizationComponent> organizationComponents = new ArrayList<>();

    public College(String name, String des) {
        super(name, des);
    }

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        // 将来实际业务中,Colleage 的 add 和  University add 不一定完全一样
        organizationComponents.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    protected void print() {
        System.out.println("--------------" + getName() + "--------------");
        //遍历 organizationComponents
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

}

// 叶子构件
public class Department extends OrganizationComponent {

	public Department(String name, String des) {
		super(name, des);
	}

	@Override
	public String getName() {
		return super.getName();
	}

	@Override
	public String getDes() {
		return super.getDes();
	}

	@Override
	protected void print() {
		System.out.println(getName());
	}

}

在这里插入图片描述

组合模式在源码中的应用

HashMap
// 抽象构件
public abstract class AbstractMap<K,V> implements Map<K,V> {
    public V put(K key, V value) {
        throw new UnsupportedOperationException();
    }
    
    public abstract Set<Entry<K,V>> entrySet();
    ......
}


public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {
    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }
    
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
        ......
    }
    public Set<Map.Entry<K,V>> entrySet() {
        Set<Map.Entry<K,V>> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }
    ......       
}


【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),是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的 阅读详情

相关推荐

C语言实战:最小二乘法在传感器数据校准中的应用(附完整代码)

本文详细介绍了如何使用C语言实现最小二乘法,对传感器数据进行线性校准。通过模拟带噪声的传感器数据,手把手演示了从核心算法实现、参数计算到效果验证的完整流程,并提供了可直接编译运行的完整源码,帮助嵌入式开发者解决传感器数据不准的常见问题,提升系统测量精度。

weixin_28025327的博客 515

设计模式:组合模式

组合模式 概述 ​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中...

qq_29860591的博客 831

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

设计模式组合模式(CompositePattern)

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

didiao11300的专栏 261

CST-Python(Pycharm如何与CST联合仿真,获取S参数)

我们想使用Python与CST联合仿真,其实是不需要自己下载Python的,因为CST在下载的时候就自带了Python3.6,我们只需要找到并将软件的环境设置到相应位置,即可联合仿真。(我的保存路径为D:\Program Files (x86)\CST Studio Suite 2020,在寻找时可以将前面切换成自己的保存路径,后面不需要修改)在CST帮助文档(打开CST软件,按F11即可直接访问帮助文档)里面,进行如下操作,便可以看到CST适配的Python版本为Python3.6!

weixin_52696285的博客 5648

zynq7020的arm A9核降频实录

zynq arm9 cortex a9 降频

qq_40011737的博客 8764

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

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

wesigj的博客 1654

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1194

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

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

613

华为OD机试真题 新系统2026-04-01 Python&JS 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 1300

《YOLOv8-seg改进》专栏指导书册 &手把手创新教程

学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研;1)手把手教你如何训练YOLOv8-seg;2)模型创新,提升分割性能;3)独家自研模块助力分割;

会AI的学姐 3810

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

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

m0_51176516的博客 1574

多无人车协同探索开源包部署教程及常见报错解决方式

本博客将介绍项目的基本概念、部署步骤以及常见问题的解决方案。该项目利用 RRT(Rapidly-exploring Random Tree)算法,通过多机器人协作进行高效的环境探索,适用于自动化与自主导航任务。项目简介:介绍该项目的核心算法、特点及应用场景,展示如何通过多个机器人共同工作来提升探索效率。部署教程:详细讲解如何在 ROS Noetic 环境中部署该项目,安装依赖、创建工作空间、克隆代码并编译项目。项目运行:包括单机器人与多机器人自主探索的示例,帮助读者快速理解和实践项目。

慕羽★的博客 1764

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

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

miaoyl的博客 2372

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式 17 组合模式 Composite Pattern

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

jxusthusiwen的专栏 1382

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

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

TechNomad的博客 1405

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

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

weixin_30797027的博客 304

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

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

d3y1`5 81_09 1038

彻底搞懂设计模式DesignPattern-组合模式

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

Ping 395

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

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

星Yeah 的博客 2971

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

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

ling_zhi_xin的博客 1589

JAVA设计模式之 组合模式【Composite Pattern】

一、组合模式介绍 组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念。 组合模式有两种模式,透明模式 和 安全模式、下面先来两个类图吧、来看看透明模式和安全模式区别; 从类图上应该能看清楚了,这两种模式各有优缺点,透明模式是把用来组合使用的方法放到抽

小吕丶Code阶区 2280

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

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

cooldragon的专栏 6607
上一篇: 设计模式之桥接模式
下一篇: 设计模式之装饰模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值