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

news2025/4/22 9:07:51

组合设计模式

  • 🚩什么是组合设计模式?
  • 🚩组合设计模式的特点
  • 🚩组合设计模式的结构
  • 🚩组合设计模式的优缺点
  • 🚩组合设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是组合设计模式?

组合设计模式(Composite Pattern) 是一种 结构型设计模式,它允许你将对象组合成 树形结构 以表示 部分-整体 的层次结构。组合模式使得客户端可以 统一处理单个对象和组合对象,无需关心它们的具体类型。

使用场景

  • 当需要表示 部分-整体 的层次结构时,例如 文件系统菜单组织结构 等。

  • 当希望客户端能够 统一处理单个对象和组合对象 时。

  • 当需要 递归地处理树形结构 时。

🚩组合设计模式的特点

  • 统一性:组合模式使得客户端可以统一处理单个对象和组合对象。

  • 递归性:组合模式支持递归地处理树形结构。

  • 灵活性:可以动态地添加或删除组合对象中的子对象。

  • 透明性:客户端无需知道处理的是单个对象还是组合对象。

🚩组合设计模式的结构

组合模式主要包含以下部分:

  • Component(抽象组件):定义所有组件的通用接口,包括 叶子节点容器节点

  • Leaf(叶子节点):表示树形结构中的叶子节点,没有子节点,类似于文件。

  • Composite(容器节点):表示树形结构中的容器节点,可以包含子节点,类似于文件夹。

  • Client(客户端):通过 Component 接口操作组合对象。

图例:

在这里插入图片描述

🚩组合设计模式的优缺点

✅ 优点

  • 统一性:客户端可以统一处理单个对象和组合对象。

  • 灵活性:可以动态地添加或删除组合对象中的子对象。

  • 递归性:支持递归地处理树形结构。

  • 透明性:客户端无需知道处理的是单个对象还是组合对象。

❌ 缺点

  • 设计复杂性:组合模式的设计可能较为复杂,尤其是处理递归结构时。

  • 性能问题:在处理深层嵌套的树形结构时,可能会影响性能。

🚩组合设计模式的Java实现

代码地址:GitHub

  • 创建 抽象组件 AbstractFile,定义所有组件的通用接口。
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName AbstractFile
 * @Description 抽象组件,定义所有组件的通用接口
 * @date 2025/3/24 14:49
 **/
public abstract class AbstractFile {

    protected String name;

    public void printName() {
        System.out.println(name);
    }

    public abstract boolean Add(AbstractFile file);

    public abstract boolean Remove(AbstractFile file);

    public abstract List<AbstractFile> getChildren();
}
  • 创建 叶子节点 File,表示树形结构中的叶子节点,类比文件系统中的文件。
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName File
 * @Description 创建 叶子节点 File,表示树形结构中的叶子节点
 * @date 2025/3/24 14:50
 **/
public class File extends AbstractFile {

    public File(String name) {
        this.name = name;
    }

    @Override
    public boolean Add(AbstractFile file) {
        return false;
    }

    @Override
    public boolean Remove(AbstractFile file) {
        return false;
    }

    @Override
    public List<AbstractFile> getChildren() {
        return null;
    }
}
  • 创建 容器节点 Folder,表示树形结构中的容器节点,类比文件系统中的文件夹。
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName Folder
 * @Description 创建 容器节点 Folder,表示树形结构中的容器节点
 * @date 2025/3/24 14:51
 **/
public class Folder extends AbstractFile {

    private List<AbstractFile> childrenList = new ArrayList<AbstractFile>();

    public Folder(String name) {
        this.name = name;
    }

    @Override
    public boolean Add(AbstractFile file) {
        return childrenList.add(file);
    }

    @Override
    public boolean Remove(AbstractFile file) {
        return childrenList.remove(file);
    }

    @Override
    public List<AbstractFile> getChildren() {
        return childrenList;
    }
}
  • 测试组合模式
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName CompositePattern
 * @Description 测试组合模式
 * @date 2025/3/24 14:53
 **/
public class CompositePattern {

    public static void main(String[] args) {
        AbstractFile root = new Folder("root");

        AbstractFile folderA = new Folder("folderA");
        AbstractFile folderB = new Folder("folderB");

        AbstractFile  fileC = new File("fileC");
        AbstractFile  fileD = new File("fileD");
        AbstractFile  fileE = new File("fileE");

        root.Add(folderA);
        root.Add(folderB);
        root.Add(fileC);

        folderA.Add(fileD);
        folderA.Add(fileE);

        print(root);
    }

    public static void print(AbstractFile file) {
        file.printName();

        List<AbstractFile> childrenList = file.getChildren();
        if (childrenList == null) return;

        for (AbstractFile children : childrenList) {
            print(children);
        }
    }
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • 抽象组件 AbstractFile 定义所有组件的通用接口。

  • 叶子节点 File 表示树形结构中的叶子节点。

  • 容器节点 Folder 表示树形结构中的容器节点。

  • 客户端 通过递归方式遍历树形结构,并统一处理单个对象和组合对象。

🚩总结

  • 组合设计模式(Composite Pattern) 允许你将对象组合成 树形结构 以表示 部分-整体 的层次结构。

  • 适用于 文件系统菜单组织结构 等需要表示部分-整体层次结构的场景。

  • Java 实现 需要 定义抽象组件叶子节点容器节点,并通过递归方式处理树形结构。

✅ 适用场景:

  • 需要表示 部分-整体 的层次结构时。

  • 希望客户端能够 统一处理单个对象和组合对象 时。

  • 需要 递归地处理树形结构 时。

在这里插入图片描述

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

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

相关文章

LSTM创新点不足?LSTM + Transformer融合模型引领Nature新突破

LSTM创新点不足&#xff1f;LSTM Transformer融合模型引领Nature新突破 2024年LSTM真的没有创新空间了吗&#xff1f; 最新研究表明&#xff0c;通过将LSTM与Transformer巧妙融合&#xff0c;依然能创造出Nature级别的突破性成果。LSTM擅长处理短期时序模式&#xff0c;但在…

【区块链安全 | 第六篇】NFT概念详解

文章目录 NFTNFT&#xff08;非同质化代币&#xff09;FT&#xff08;可替代代币&#xff09; 以太坊 NFT 标准ERC-721&#xff08;单一资产&#xff09;ERC-1155&#xff08;多资产&#xff09; NFT 市场版税机制NFT 借贷NFT 安全 NFT NFT&#xff08;Non-Fungible Token&…

iOS常见网络框架

URLSession、Alamofire 和 Moya 1. URLSession 1.1 核心概念 URLSession 是 Apple 官方提供的网络请求 API&#xff0c;封装在 Foundation 框架中。它支持 HTTP、HTTPS、FTP 等协议&#xff0c;可用于&#xff1a; ​ • 普通网络请求&#xff08;GET/POST&#xff09; ​ …

蓝桥杯备考---->激光炸弹(二维前缀和)

本题我们可以构造二维矩阵&#xff0c;然后根据题意&#xff0c;枚举所有边长为m的正方形&#xff0c;找到消灭价值最多的炸弹 #include <iostream> using namespace std; const int N 1e4; int a[N][N]; int n,m; int f[N][N]; int main() {cin >> n >> m…

数据结构 --树和森林

树和森林 树的存储结构 树的逻辑结构 树是一种递归定义的数据结构 树是n(n≥0)个结点的有限集。当n0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 1)有且仅有一个特定的称为根的结点。 2)当n>1时&#xff0c;其余结点可分为m(m>0)个互不相交的有…

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制&#xff0c;并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后&#xff0c;解锁资源&#xff0c;再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bi…

Linux系统加固笔记

检查口令为空的账户 判断依据&#xff1a;存在则不符合 特殊的shell a./bin/false:将用户的shell设置为/bin/false&#xff0c;用户会无法登录&#xff0c;并且不会有任何提示信息b./sbib/nologin&#xff1a;nologin会礼貌的向用户发送一条消息&#xff0c;并且拒绝用户登录…

【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码

本章目录 1. sync.Mutex锁的基本用法2. sync.Mutex的核心原理自旋到阻塞的升级过程自旋CAS 饥饿模式 3. sync.Mutex底层源码Mutex结构定义全局常量Mutex.Lock()方法第一次CAS加锁能够成功的前提是&#xff1f;竞态检测 Mutex.lockSlow()lockSlow的局部变量自旋空转state新值构造…

Django REST framework 源码剖析-认证器详解(Authentication)

Django REST framework 源码剖析-认证器详解(Authentication) 身份验证始终在视图的最开始运行&#xff0c;在权限和限制检查发生之前&#xff0c;以及在允许任何其他代码继续之前。request.user属性通常设置为contrib.auth包的user类的实例。request.auth属性用于任何其他身份…

TCP/IP三次握手的过程,为什么要3次?

一&#xff1a;过程 第一次&#xff08;SYN&#xff09;&#xff1a; 客户端发送一个带有SYN标志的TCP报文段给服务器&#xff0c;设置SYN1&#xff0c;并携带初始序列号Seqx&#xff08;随机值&#xff09;&#xff0c;进入SYN_SENT状态。等待服务器相应。 第二次&#xff08…

Centos6安装nerdctl容器运行时

Centos6安装nerdctl容器运行时 前言Centos6安装docker---失败--不可拉取镜像docker配置国内镜像加速 Centos6安装nerdctl-full容器管理工具为Centos6配置containerd服务开机自启动设置nerdctl自动补全 前言 本文写于2025年3月22日,因一些特殊业务需要用到Centos6Docker,但Cent…

登录验证码的接口实习,uuid,code.

UID是唯一标识的字符串,下面是百度百科关于UUID的定义&#xff1a; UUID是由一组32位数的16进制数字所构成&#xff0c;是故UUID理论上的总数为16322128&#xff0c;约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID&#xff0c;要花100亿年才会将所有UUID用完。 UUID的标准…

用fofa语法搜索漏洞

FOFA是一款非常强大的搜索引擎 关于对于fofa的描述是&#xff1a;FOFA&#xff08;网络空间资产检索系统&#xff09;是世界上数据覆盖更完整的IT设备搜索引擎&#xff0c;拥有全球联网IT设备更全的DNA信息。 探索全球互联网的资产信息&#xff0c;进行资产及漏洞影响范围分析…

20242817李臻《Linux⾼级编程实践》第6周

20242817李臻《Linux⾼级编程实践》第6周 一、AI对学习内容的总结 Linux进程间通信&#xff08;IPC&#xff09; 1. 进程间通信基本概念 作用: 数据传输&#xff1a;进程间传递数据&#xff08;字节到兆字节级别&#xff09;。共享数据&#xff1a;多个进程操作同一数据&…

深入解析SQL2API平台:数据交互革新者

在数字化转型持续深入的当下&#xff0c;企业对数据的高效利用与管理的需求愈发迫切。SQL2API平台应运而生&#xff0c;成为助力企业突破数据交互困境的有力工具&#xff0c;特别是它由麦聪软件基于DaaS&#xff08;数据即服务&#xff09;产品创新衍生而来&#xff0c;备受业界…

Java 中装饰者模式与策略模式在埋点系统中的应用

前言 在软件开发中&#xff0c;装饰者模式和策略模式是两种常用的设计模式&#xff0c;它们在特定的业务场景下能够发挥巨大的作用。本文将通过一个实际的埋点系统案例&#xff0c;探讨如何在 Java 中运用装饰者模式和策略模式&#xff0c;以及如何结合工厂方法模式来优化代码…

无人设备遥控器之调度自动化技术篇

一、技术原理 信息采集与处理&#xff1a; 通过传感器、仪表等设备采集无人设备的各种数据&#xff0c;如位置、速度、状态等。 将采集到的数据传输到调度自动化系统中进行处理和分析&#xff0c;以获取设备的实时状态。 系统建模与优化&#xff1a; 调度自动化系统会根据…

【AI】Orin Nano+ubuntu22.04上移植YoloV11,并使用DeepStream测试成功

【AI】郭老二博文之:AI学习目录汇总 1、准备工作 使用 sdk-manager 烧写 OrinNano, JetPack版本为6.0 DP,对应操作系统为:Ubuntu22.04 参见博客:【NVIDIA】Jetson Orin Nano系列:烧写Ubuntu22.04 2、安装 PyTorch 2.1 下载依赖 1)安装onnx pip install onnx -i h…

K8S学习之基础四十五:k8s中部署elasticsearch

k8s中部署elasticsearch 安装并启动nfs服务yum install nfs-utils -y systemctl start nfs systemctl enable nfs.service mkdir /data/v1 -p echo /data/v1 *(rw,no_root_squash) >> /etc/exports exports -arv systemctl restart nfs创建运行nfs-provisioner需要的sa账…

如何在 Windows 上安装并使用 Postman?

Postman 是一个功能强大的API测试工具&#xff0c;它可以帮助程序员更轻松地测试和调试 API。在本文中&#xff0c;我们将讨论如何在 Windows 上安装和使用 Postman。 Windows 如何安装和使用 Postman 教程&#xff1f;