【设计模式】32.结构型模式-组合模式(Composite)

news2024/11/14 1:14:59

一、描述

首先,看一个数据结构:
在这里插入图片描述
在平时开发过程中,我们的菜单目录、文件夹目录等都有类似如上的实体结构,其中composite代表父级节点,leaf代表叶子节点,composite可以有子节点,但是leaf下没有节点。解析此结构时,循环解析每个节点,当解析到叶子节点时,当前循环结束。这种数据结构就是组合模式的代表结构。

定义:

组合模式将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

角色

(1)Component(抽象构件):为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。定义了管理子构件的方法,如定义了新增构件、删除构件、获取构件的方法等。
(2)Composite(中间构件):提供一个集合包含其他构件或者叶子节点,实现抽象构件方法,管理集合中的节点。
(3)Leaf(叶子节点):实现抽象构件方法,但是其没有子节点。

类图

在这里插入图片描述

二、优点

(1)高层模块调用简单。一颗树形结构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,高层模块不必关心自己处理的是单个对象还是整个组合接口。
(2)节点自由添加

三、缺点

(1)使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒转原则

四、使用场景

(1)维护和展示部分-整体关系的场景(树形菜单、文件和文件夹管理)
(2)一个整体中能够独立出部分模块或功能的场景

五、示例

以“电脑硬盘上的文件夹以及文件为例”,文件夹下有文件,文件夹是具体构件,文件是叶子节点。下面是代码:
(1)IFile,定义文件公共方法

public interface IFile {
    /**
     * 添加文件或者文件夹
     *
     * @param iFile
     */
    void add(IFile iFile);

    /**
     * 删除文件或者文件夹
     *
     * @param iFile
     */
    void delete(IFile iFile);

    /**
     * 获取文件或者文件夹
     *
     * @return
     */
    void operation();

    /**
     * 获取文件信息
     *
     * @param i
     * @return
     */
    IFile get(int i);
}

(2)定义中间构件Folder

public class Folder implements IFile {
    //存储文件集合
    private List<IFile> children = new ArrayList<>();
    //文件夹名称
    private String name;

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

    @Override
    public void add(IFile iFile) {
        children.add(iFile);
    }

    @Override
    public void delete(IFile iFile) {
        children.remove(iFile);
    }

    @Override
    public void operation() {
        System.out.println(name + "文件夹,其下有:");
        for (int i = 0; i < children.size(); i++) {
            System.out.print("-");
            children.get(i).operation();
        }
    }

    @Override
    public IFile get(int i) {
        return children.get(i);
    }
}

(3)叶子节点File,文件

public class File implements IFile {
    private String name;

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

    @Override
    public void add(IFile iFile) {
        System.out.println("叶子节点无法添加文件");
    }

    @Override
    public void delete(IFile iFile) {
        System.out.println("叶子节点无法删除文件");
    }

    @Override
    public void operation() {
        System.out.println(name + "文件");
    }

    @Override
    public IFile get(int i) {
        return this;
    }
}

(4)Client,客户端
文件夹结构如下:

d:
-code:
--company:
---projectA:
----classA1
---projectB
----classB1
-me
--myproject:
---excelA.xls
public class Client {
    public static void main(String[] args) {
        //D盘下有code文件夹,code文件夹下有company和me文件夹,文件夹下是项目,项目下是代码文件
        Folder d = new Folder("d盘");
        Folder code = new Folder("code");
        Folder company = new Folder("company");
        Folder me = new Folder("me");

        d.add(code);
        code.add(company);
        code.add(me);

        Folder projectA = new Folder("projectA");
        File classA1 = new File("classA1");
        projectA.add(classA1);
        Folder projectB = new Folder("projectB");
        File classB1 = new File("classB1");
        projectB.add(classB1);
        company.add(projectA);
        company.add(projectB);

        Folder myProject = new Folder("myProject");
        File excelA = new File("excelA.xls");
        me.add(myProject);
        me.add(excelA);

        d.operation();
    }
}

实现效果,由于主要是体现组合模式,因此没有实现结构划分:
在这里插入图片描述

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

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

相关文章

一文读懂ChatGPT模型原理

&#xff08;本文是ChatGPT原理介绍&#xff0c;但没有任何数学公式&#xff0c;可以放心食用&#xff09; 前言 这两天&#xff0c;ChatGPT模型真可谓称得上是狂拽酷炫D炸天的存在了。一度登上了知乎热搜&#xff0c;这对科技类话题是非常难的存在。不光是做人工智能、机器学习…

ORB-SLAM2 ---- Tracking::TrackWithMotionModel函数

目录 1.函数作用 2.步骤 3.code 4.函数解释 4.1 更新上一帧的位姿&#xff1b;对于双目或RGB-D相机&#xff0c;还会根据深度值生成临时地图点 4.2 根据之前估计的速度&#xff0c;用恒速模型得到当前帧的初始位姿。 4.3 用上一帧地图点进行投影匹配&#xff0c;如果匹…

JDK版本对应其major.minor version,看这一篇就够啦(附java历史版本下载地址)

文章目录前言JDK版本对应其major versionJDK历史版本下载地址前言 今天博主在学习SpringBoot&#xff0c;启动项目时遇到这样一个问题 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project springbo…

[附源码]JAVA毕业设计企业信息安全评价系统(系统+LW)

[附源码]JAVA毕业设计企业信息安全评价系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

[附源码]Python计算机毕业设计Django小区疫情事件处理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Git学习笔记 Git Gitee GitHub GitLab

目录 Git GitHub Gitee码云 GitLab Git 概述 何为版本控制 为什么需要版本控制 集中式版本控制工具 分布式版本控制工具 Git和代码托管中心 Git命令 git init命令 git config git status 查看 git 状态 git rm --cached xx git commit -m “备注” xx git reflo…

PHP代码审计系列(二)

PHP代码审计系列&#xff08;二&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 strcmp比较字符串 源码如下 <?php $flag "flag"; if (isset($_GET[a])) { if (strcmp($_GET[a], …

DBCO-PEG3-Maleimide,Mal-PEG3-DBCO,二苯并环辛炔-三聚乙二醇-马来酰亚胺

​ 中英文名&#xff1a; CAS号&#xff1a;N/A| 英文名&#xff1a;DBCO-PEG3-Maleimide&#xff0c;Mal-PEG3-DBCO |中文名&#xff1a;二苯并环辛炔-三聚乙二醇-马来酰亚胺物理参数&#xff1a; CASNumber&#xff1a;N/A Molecular formula&#xff1a;C34H38N4O8 Molecul…

[附源码]计算机毕业设计绿色生鲜Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

一键免密登录云平台!ZStack Cloud 4.5.0等你来解锁……

近日&#xff0c;ZStack Cloud 4.5.0发布&#xff0c;新增支持多种标准单点登录&#xff08;SSO&#xff09;协议。云平台现可对接OIDC/OAuth2/CAS三种协议的统一身份认证系统&#xff0c;使认证系统中的用户可一键免密登录云平台&#xff0c;大大提高了云平台的访问效率和安全…

在 Git Bash 中为 vim 设置 Dracula 配色

因为本人一直习惯了用 Jetbrains 家的产品&#xff0c;而且一直独钟 Dracula 配色&#xff0c;因此想要在 Git Bash 中为 vim 配一款 Dracula 配色。本博客将详细介绍如何为 vim 配置暗系主题 Dracula。 一、安装 Dracula 在 Dracula 的官网其实已经给出了关于如何在 vim 中配…

Pygame入门

目录一、初始化pygame环境&#xff08;一&#xff09;在pycharm中新建一个工程&#xff08;二&#xff09;安装pygame&#xff08;三&#xff09;测试安装是否成功二、pygame基础&#xff08;一&#xff09;pygame初始化&#xff08;二&#xff09;设置显示界面&#xff08;三&…

[附源码]计算机毕业设计JAVA在线二手车交易信息管理系统

[附源码]计算机毕业设计JAVA在线二手车交易信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

《PyInstaller打包实战指南》第二十二节 单文件模式打包Playwright

第二十二节 单文件模式打包Playwright 打包示例源码下载: 请看文章末尾 版本信息: playwright==1.28.0 pyinstaller==5.3 打包系统: Windows 10 打包前我们要先运行下代码,确保没有报错: # belle.py from playwright.sync_api import sync_playwrightwith sync_playw…

【Android】 android | as | android studio 安装与使用

一、说明 1、本文重点介绍android studio的使用&#xff0c;做Android应用开发 2、主要包括&#xff1a; 下载&#xff0c;安装&#xff0c;sdk配置&#xff0c;工具使用说明 二、下载Android Studio与配置 1、下载链接 https://developer.android.google.cn/studio 2、安装 参…

特征工程特征预处理归一化与标准化、鸢尾花种类预测代码实现

一、特征预处理 特征工程目的&#xff1a;把数据转换成机器更容易识别的数据 scikit-learn&#xff1a;提供几个常见的实用程序函数和转换器类&#xff0c;以将原始特征向量更改为更适合下游估计器的表示形式。即通过一些转换函数将特征数据转换成更加适合算法模型的特征数据…

IDEA基本配置

1.设置maven 1.在File->settings->搜索maven 2.Mavan home directory--设置maven安装包的bin文件夹所在的位置 3.User settings file--设置setting文件所在的位置 4.Local repository--设置本地仓库 2.IDEA 设置代码行宽度 1.在File->settings->Editor->Code St…

深度学习训练营之彩色图片分类

深度学习训练营原文链接环境介绍前置工作设置GPU导入数据归一化操作图片可视化构建CNN网络进行编译模型训练结果可视化图片展示对图片的内容进行辨别模型的精度评估原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&…

我为什么选择博客园!

过去一段时间我尝试了很多平台&#xff0c;说下感受。但是最后我还是选择了博客园。 1. 开始写csdn的原因&#xff1a; 积累一些东西&#xff0c;从而为自己的简历以及工作加分。 分享知识。 梳理知识和记录&#xff0c;因为好多东西做过&#xff0c;再问就忘了。尤其是面试…

深度学习-扩张卷积(dilated convolution)

1. 前言 扩张卷积&#xff08;DilatedConvolution&#xff09;也被称为空洞卷积或者膨胀卷积&#xff0c;是在标准的卷积核中注入空洞&#xff0c;以此来增加模型的感受野&#xff08;receptionfield&#xff09;\color{blue}{扩张卷积&#xff08;Dilated Convolution&#xf…