组合模式:构建树形结构的灵活设计

news2025/2/22 14:24:31

组合模式是一种结构型设计模式,它允许我们将对象组合成树形结构,以表示“部分-整体”的层次结构。本文将深入探讨组合模式的原理、结构和使用方法,并通过详细的 Java 示例代码来说明。

1. 组合模式的定义

组合模式是一种将对象组合成树形结构的设计模式。它通过使用相同的接口来处理单个对象和组合对象,使得客户端可以统一地处理它们。组合模式的目的是让客户端能够以一致的方式处理单个对象和组合对象。

2. 组合模式的结构

组合模式包含以下几个核心角色:

  • 组件(Component):定义了组合对象和叶子对象的共同接口,可以是抽象类或接口。它可以定义一些默认的行为,比如增加、删除和获取子节点。
  • 叶子(Leaf):表示组合对象中的叶子节点,它没有子节点。实现了组件接口的方法,但是对于增加、删除和获取子节点的操作,可以选择不实现或抛出异常。
  • 组合(Composite):表示组合对象中的容器节点,它可以包含子节点。实现了组件接口的方法,并在其中实现了增加、删除和获取子节点的操作。
  • 客户端(Client):通过组件接口操作组合对象的客户端代码。

下图展示了组合模式的结构:

3. 组合模式的工作原理

组合模式的工作原理可以简述如下:

  1. 定义组件接口,包含组合对象和叶子对象的共同操作。
  2. 创建叶子类,实现组件接口的方法。对于增加、删除和获取子节点的操作,可以选择不实现或抛出异常。
  3. 创建组合类,实现组件接口的方法。在其中实现增加、删除和获取子节点的操作,并提供其他操作。
  4. 在客户端中,通过组件接口操作组合对象,无需关心是操作单个对象还是组合对象。

4. Java 示例代码

下面通过一个简单的 Java 示例代码来演示组合模式的使用。

首先,我们定义组件接口 Component,其中包含了组合对象和叶子对象的共同操作:

public interface Component {
    void operation();
    void add(Component component);
    void remove(Component component);
    Component getChild(int index);
}

然后,我们创建叶子类 Leaf,实现了组件接口的方法。对于增加、删除和获取子节点的操作,我们选择不实现或抛出异常:

public class Leaf implements Component {
    @Override
    public void operation() {
        System.out.println("Leaf operation");
    }

    @Override
    public void add(Component component) {
        throw new UnsupportedOperationException("Leaf cannot add child");
    }

    @Override
    public void remove(Component component) {
        throw new UnsupportedOperationException("Leaf cannot remove child");
    }

    @Override
    public Component getChild(int index) {
        throw new UnsupportedOperationException("Leaf does not have child");
    }
}

接下来,我们创建组合类 Composite,实现了组件接口的方法。在其中实现了增加、删除和获取子节点的操作,并提供其他操作:

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

public class Composite implements Component {
    private List<Component> children = new ArrayList<>();

    @Override
    public void operation() {
        System.out.println("Composite operation");
        for (Component child : children) {
            child.operation();
        }
    }

    @Override
    public void add(Component component) {
        children.add(component);
    }

    @Override
    public void remove(Component component) {
        children.remove(component);
    }

    @Override
    public Component getChild(int index) {
        return children.get(index);
    }
}

最后,我们在客户端中使用组合模式,通过组件接口操作组合对象:

public class Client {
    public static void main(String[] args) {
        Component leaf1 = new Leaf();
        Component leaf2 = new Leaf();

        Component composite1 = new Composite();
        composite1.add(leaf1);
        composite1.add(leaf2);

        Component leaf3 = new Leaf();

        Component composite2 = new Composite();
        composite2.add(composite1);
        composite2.add(leaf3);

        composite2.operation();
    }
}

输出结果为:

Composite operation
Leaf operation
Leaf operation
Leaf operation

从输出结果可以看出,通过组合模式,我们成功地将组合对象和叶子对象统一处理,并构建了树形结构。

5. 组合模式的优点和适用场景

组合模式具有以下优点:

  • 灵活性:组合模式允许我们以统一的方式处理单个对象和组合对象,使得客户端代码更加灵活。
  • 扩展性:组合模式使得我们可以很容易地增加新的组件类,扩展树形结构。
  • 简化客户端代码:组合模式使得客户端代码可以统一处理组合对象和叶子对象,无需区分它们的类型。

组合模式适用于以下场景:

  • 需要构建树形结构的场景,例如文件系统、菜单、组织结构等。
  • 需要以统一的方式处理单个对象和组合对象的场景。
  • 需要对树形结构进行操作和遍历的场景。

6. 总结

组合模式是一种将对象组合成树形结构的设计模式。通过组合模式,我们可以构建树形结构,并以统一的方式处理单个对象和组合对象。组合模式具有灵活性、扩展性和简化客户端代码的优点,适用于需要构建树形结构并统一处理的场景。

公众号请关注"果酱桑", 一起学习,一起进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven引入Jacoco插件后无法生成jacoco.exec执行文件

目录 jacoco.exec网上常见关于未生成jacoco.exec原因最终解决方案不生效原因解决方案 完整jacoco插件配置 jacoco.exec 执行数据文件&#xff0c;只有生成该文件&#xff0c;才表示引入插件jacoco成功生效 网上常见关于未生成jacoco.exec原因 网上找了一下解决方式基本都是…

windows下使用arp 协议

/ //自动扫描局域网存活主机 本程序是利用arp协议去获取局域网中的存活主机 arp协议概述 地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请…

「Paraverse平行云」入选IDC MarketScape中国实时云渲染解决方案

近日&#xff0c;全球领先的IT研究与咨询顾问机构IDC发布了《IDC MarketScape&#xff1a;中国实时云渲染解决方案2023年厂商评估》报告。作为在实时云渲染技术领域具有代表性的技术提供商&#xff0c;「Paraverse平行云」成功入选报告。 IDC报告通过综合考量厂商在产品、市场…

一文搞懂Goroutine之间的通信Channel

文章目录 Channel定义通道初始化通道通道的操作1、发送/接收2、关闭 多返回值模式for range获取通道值 单向通道selectgoroutine、channel案例 道阻且长&#xff0c;行则将至&#xff0c;行而不辍&#xff0c;未来可期&#x1f31f;。人生是一条且漫长且充满荆棘的道路&#xf…

C++函数cincout的基本用法

C的输入输出格式可比C语言的简单得多&#xff0c;输入函数是cin()&#xff0c;输出函数是cout。 首先是cin的基本用法如下 (假设n 5) #include <iostream> using namespace std; int main() {int n;cin>>n;return 0; } 而它的结果则是 cin不仅可以输入int类型…

从单目数据生成3D模型,Meta智能眼镜摄像头校正算法揭秘

众所周知&#xff0c;Meta下一个目标就是AR眼镜&#xff0c;尽管开发AR比VR面临更多复杂的难题&#xff0c;因此可能还要过一段时间才能看到Meta的AR眼镜。目前&#xff0c;该公司已推出了第一代Ray-Ban Stories智能眼镜&#xff0c;特点是搭载的双摄像头不仅可以拍照&#xff…

Verilog基础之十五、锁存器实现

目录 一、前言 二、工程设计 2.1 工程代码 2.2 综合结果 2.3 Latch实现 一、前言 在之前的文章中介绍过寄存器&#xff0c;本节介绍一个类似的逻辑单元&#xff1a;锁存器。在大部分的资料和文章介绍中&#xff0c;都是告诉读者设计中应尽量避免出现锁存器&#xff0c;这主…

从0到1,带你深入了解react fiber

react16之后&#xff0c;react引入了fiber架构&#xff0c;那么它究竟是什么&#xff0c;如何实现的呢&#xff1f;下面就让笔者带你掰扯掰扯&#xff0c;如有错误&#xff0c;欢迎指正 目录 渲染过程 react15 react16 为什么要引入fiber 不可中断原因 fiber详解 是什么…

百度墨斗鱼文库创作中心源码分析

前言 公司解散&#xff0c;待业中&#xff0c;耗时一天研究了一下百度墨斗鱼文库创作中心源码。实现了后台自动完成任务并通知。 下面主要分析一下实现思路和难点 一&#xff0c;实现思路 调用接口查询未回答的题目列表 合并多个tab下的题目 设置黑白名单&#xff0c;这里…

你知道为什么不用XFP光模块了吗?

在光纤通信应用领域中&#xff0c;10G光模块凭借着较低的成本和功耗被广泛应用于学校、企业等应用场景中。XFP和SFP是10G光模块常见的两种封装类型&#xff0c;那为什么现在市场上XFP光模块应用比较少了呢&#xff1f;下面我们来简单分析一下原因。 一、XFP与SFP光模块的概述 …

从小白到大神之路之学习运维第58天--------Firewalld防火墙

第三阶段基础 时 间&#xff1a;2023年7月12日 参加人&#xff1a;全班人员 内 容&#xff1a; Firewalld防火墙 目录 Firewalld防火墙 一、防火墙 1、netfilter和防火墙管理工具 2、防火墙配置模式 3、Firewalld数据流处理的方式 4、firewalld区域类型 1&#x…

【SVN wc.db 删除不掉的问题】

SVN wc.db 删除不掉的问题 方案1&#xff1a;任务管理器 >性能 >打开资源监视器 > CPU >搜索句柄&#xff0c;关闭相关线程&#xff0c;重试删除。若删除explorer.exe导致资源管理器不显示&#xff0c;在任务管理器新建该任务即可“explorer.exe” 方案2&#xff1…

2023-07-12:RocketMQ如何做到消息不丢失?

2023-07-12&#xff1a;RocketMQ如何做到消息不丢失&#xff1f; 答案2023-07-12&#xff1a; RocketMQ通过刷盘机制、消息拉取机制和ACK机制等多种方式来确保消息投递的可靠性&#xff0c;防止消息丢失。 1.刷盘机制 RocketMQ中的消息分为内存消息和磁盘消息&#xff0c;内…

Acwing.858 Prim算法求最小生成树(朴素Prims算法)

题目 给定一个n个点m条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出impossible。 给定一张边带权的无向图G(V,E)&#xff0c;其中V表示图中点的集合&#xff0c;E表示图中边的…

赛效:如何用在线压缩GIF图片

1&#xff1a;在电脑网页上打开并登录快改图&#xff0c;点击左侧菜单栏里的“GIF压缩”。 2&#xff1a;点击页面中间的上传按钮&#xff0c;将电脑本地的GIF文件上传上去。 3&#xff1a;GIF文件上传成功后&#xff0c;设置下方压缩设置&#xff0c;点击右下角“开始压缩”。…

APP外包开发硬件通讯协议

开发APP时会遇到需要与硬件设备通讯的业务场景&#xff0c;常见的硬件设备有健康设备(手环、血压计、血糖仪等)、智能家居设备(冰箱、灯、电视等)、工业设备等等&#xff0c;这些设备的通讯要求各不相同&#xff0c;因此通讯协议也不相同。今天和大家分享这方面的知识&#xff…

buu-Reverse-[2019红帽杯]childRE

目录 [2019红帽杯]childRE 修饰函数名和函数签名是什么&#xff1f; 对于变换部分的具体分析&#xff1a; [2019红帽杯]childRE 下载附件&#xff0c;查壳&#xff0c;无壳 在IDA中打开&#xff0c;定位主函数 int __cdecl main(int argc, const char **argv, const char …

深度学习笔记之Transformer(八)Transformer模型架构基本介绍

机器学习笔记之Transformer——Transformer模型架构基本介绍 引言回顾&#xff1a;简单理解&#xff1a; Seq2seq \text{Seq2seq} Seq2seq模型架构与自编码器自注意力机制 Transformer \text{Transformer} Transformer架构关于架构的简单认识多头注意力机制包含掩码的多头注意力…

kubernetes 1.27.3 集群部署方案

一、准备环境 1.1 Kubernetes 1.27.3 版本集群部署环境准备 1.1.1 主机硬件配置说明 cpu内存硬盘角色主机名系统版本 8C 8G 1024GB master master01 centos 7.9 8C 16G 1024GB worker(node) worker01 centos 7.9 8C 16G 1024GB worker(node) worker…

EasyCVR平台Ehome协议接入,设备管理中出现新增通道按钮的问题优化

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 有用…