组合模式

news2024/9/20 8:08:35

文章目录

    • 思考组合模式
      • 1.组合模式的本质
      • 2.何时选用组合模式
      • 3.优缺点
      • 4.实现

思考组合模式

组合模式实际上就是让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。

1.组合模式的本质

组合模式的本质:统一叶子对象和组合对象。

组合模式通过把叶子对象当成特殊的组合对象看待,从而对叶子对象和组合对象一视同仁,全部当成了Component对象,有机地统一了叶子对象和组合对象。
正是因为统一了叶子对象和组合对象,在将对象构建成树型结构的时候,才不需要做区分,反正是组件对象里面包含其他的组件对象,如此递归下去;也才使得对于树形结构的操作变得简单,不管对象类型,统一操作。
在这里插入图片描述

  • Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现。
  • Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他的子节点对象。
  • Composite:组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子组件有关的操作。
  • Client:客户端,通过组件接口来操作组合结构里面的组件对象。

2.何时选用组合模式

建议在以下情况中选用组合模式。

  • 如果你想表示对象的部分—整体层次结构,可以选用组合模式,把整体和部分的操作统一起来,使得层次结构实现更简单,从外部来使用这个层次结构也容易。
  • 如果你希望统一地使用组合结构中的所有对象,可以选用组合模式,这正是组合模式提供的主要功能。

3.优缺点

组合模式有以下优点。

  • 定义了包含基本对象和组合对象的类层次结构
    在组合模式中,基本对象可以被组合成复杂的组合对象,而组合对象又可以组合成更复杂的组合对象,可以不断地递归组合下去,从而构成一个统一的组合对象的类层次结构。

  • 统一了组合对象和叶子对象
    在组合模式中,可以把叶子对象当作特殊的组合对象看待,为它们定义统一的父类,从而把组合对象和叶子对象的行为统一起来。

  • 简化了客户端调用
    组合模式通过统一组合对象和叶子对象,使得客户端在使用它们的时候,不需要再去区分它们,客户不关心使用的到底是什么类型的对象,这就大大简化了客户端的使用。

  • 更容易扩展
    由于客户端是统一地面对Component来操作,因此,新定义的Composite或 Leaf子类能够很容易地与已有的结构一起工作,而客户端不需要为增添了新的组件类而改变。

4.实现

一个学校有多个学院,一个学院有多个专业,抽象成一个树形结构
学校和学院都可以有叶子节点,可以共用一个类(Composite),叶子节点单独用一个类(Leaf)
在这里插入图片描述

1.父接口

/**
 * @description:父接口
 */
@Data
public abstract class Component {

    /**
     * 打印
     * @param preStr
     */
    public abstract void print(String preStr);

    /**
     * 添加对象
     * @param component
     */
    public void add(Component component){
        throw new UnsupportedOperationException("对象不支持这个功能");
    }

    /**
     * 移除对象
     * @param component
     */
    public void remove(Component component){
        throw new UnsupportedOperationException("对象不支持这个功能");
    }

}

2.组合对象类

/**
 * @description:组合对象(学校、学院)
 */
public class Composite extends Component {

    private String name;

    private List<Component> list = new ArrayList<>();

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

    @Override
    public void print(String preStr) {
        System.out.println(preStr+"+"+this.name);
        if (this.list!=null){
            preStr+=" ";
            for (Component c: list){
                c.print(preStr);
            }
        }
    }

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

}

3.叶子类

/**
 * @description:叶子对象(系)
 */
@AllArgsConstructor
public class Leaf extends Component {

    /**
     * 叶子节点名字
     */
    private String name;

    @Override
    public void print(String preStr) {
        System.out.println(preStr+"-"+name);
    }
}

4.测试类

public class Client {


    public static void main(String[] args) {
        //学校
        Component university = new Composite("清华大学");
        //学院
        Component computerCollege = new Composite("计算机学院");
        Component mathCollege = new Composite("数学学院");

        //学院添加系
        computerCollege.add(new Leaf("软件"));
        computerCollege.add(new Leaf("电子"));
        computerCollege.add(new Leaf("通信"));
        mathCollege.add(new Leaf("概率"));
        mathCollege.add(new Leaf("统计"));

        //学校添加学院
        university.add(computerCollege);
        university.add(mathCollege);

        //输出学校结构
        university.print("");
    }
}

在这里插入图片描述
这样就实现了类似树形结构
在这里插入图片描述

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

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

相关文章

No.179 念念随风上九霄

引言有人跟老梁说&#xff0c;你挺忙的吧&#xff0c;更新变少了。害&#xff0c;可不是嘛&#xff1f;时间不太够&#xff0c;凑不出来了。凑不出来就不凑它了&#xff0c;扯扯其他的吧。在大城市生活节奏是快&#xff0c;个人也被裹挟着运转&#xff0c;无处可逃。从早到晚&a…

[附源码]计算机毕业设计基于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…

如何用 7 分钟击破 Serverless 落地难点?

当前&#xff0c;Serverless 覆盖的技术场景正在不断变广。Serverless 已在微服务、在线应用、事件驱动、任务处理等众多场景被验证且广泛应用 。当你想要部署一个网站时&#xff0c;需要自己购买服务器并花费时间去维护&#xff0c;造成资源浪费不说&#xff0c;还要耗费精力。…

【NR 物理资源】

NR中与物理资源相关的概念主要包括天线端口、资源网格、资源单元、资源块RB和BWP等。 文章目录天线端口&#xff08;Antenna Ports&#xff09;资源网格Resource grid和资源单元RE资源块Resource Block部分带宽BWP天线端口&#xff08;Antenna Ports&#xff09; 天线端口定义 …

qmake source code 解读

qmake的主要功能执行入口在main.cpp中的runQMake(int argc, char **argv)中。其主要框架如下: runQMake(int argc, char **argv){QMakeVfs vfs; //初始化qmake的文件系统。virtual file system。vfs会为每个文件赋予一个id,并提供根据id进行操作的函数。Option::vfs &v…

交通流的微观模型(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

用好单例设计模式,代码性能提升300%

目录 一次请求执行流程java代码是如何运行的&#xff1f;堆内存满了后怎么办&#xff1f;用单例模式如何优化系统性能&#xff1f; 大家好&#xff0c;今天给大家分享一个写代码的设计模式&#xff0c;就是我们最最耳熟能详的单例设计模式。 可能很多人都听说过这个单例设计模…

基于Dijkstra和A*算法的机器人路径规划(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 网络分析是GIS中非常重要的空间分析功能之一, 最短路径分析又是网络分析的核心算法, 该算法的效率决定了网络分析的功能和效率…

【CSDN】官方Markdown示例教程

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Docker学习系列3:常用命令之容器命令

本文是Docker学习系列教程中的第三篇。前几篇教程如下&#xff1a; 「图文教程」Windows11下安装Docker Desktop 「填坑」在windows系统下安装Docker Desktop后迁移镜像位置 Docker学习系列1-如何安装docker? 【Docker学习系列】Docker学习2-docker设置阿里云镜像加速器 【Doc…

简单宠物网页设计作业 静态HTML动物介绍网页作业 DW宠物网站模板下载 大学生简单野生动物网页作品代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

ADSP-21569/ADSP-21593的开发入门(下)

开始调试 软硬件都准备好了&#xff0c;该插的JTAG头&#xff0c;2根usb线都插好了&#xff0c;我们就开始进入调试&#xff0c;首先是要搭建软件环境。 软件用的是CCES&#xff0c;这个软件是基于Eclipse的&#xff0c;基本操作跟他都一样&#xff0c;我们首先打开软件。 他…

阿里资深架构师钟华曰:中台战略思想与架构实战;含内部实施手册

​ 编辑 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 最近在读一本书&#xff0c;叫做《企业IT架构转型之道&#xff1a;阿里巴巴中台战略思想与架构实战》&#xff0c;在写此文时本书还没有看完&#xff0c;因为担心如果把书全部看完后再来写这篇文…

Android轮播图控件com.github.pinguo-zhouwei:MZBannerView:v2.0.2

build.gradle 配置&#xff1a; dependencies { compile com.github.pinguo-zhouwei:MZBannerView:v2.0.2}xml布局&#xff1a; <com.zhouwei.mzbanner.MZBannerViewandroid:id"id/banner"android:layout_width"match_parent"android:layout_height&quo…

SpringBoot项目实现发布订阅模式,真的很简单

大家好&#xff0c;我是老三&#xff0c;在项目里&#xff0c;经常会有一些主线业务之外的其它业务&#xff0c;比如&#xff0c;下单之后&#xff0c;发送通知、监控埋点、记录日志…… 这些非核心业务&#xff0c;如果全部一梭子写下去&#xff0c;有两个问题&#xff0c;一…

python中的集合详解

目录 一.思考 二.集合 基本语法 集合的常用操作——修改 1.添加新元素 2.移除元素 3.从集合中随机取出元素 4.清空集合 5. 消除两个集合的差集 6.两个集合的合并 注意&#xff1a;集合的遍历 三.集合总结 一.思考 为什么使用集合&#xff1f; 我们目前接触到了列表、元…

php后端+JQuery+Ajax简单表单提交

通过ajax,如果从后端直接想前端返回数组,那前端收到的是一个‘Array’的字符串。所以,我比较习惯的是用json对象的格式。由后端通过json_encode()函数,把数组封装成对象,传递到前端;前端也以json的格式接收。这里用提交表单来举例说明。 页面显示如下: JQueryAjax.…

Kafka服务端参数配置

$KAFKA_HOME/config/server.properties文件中的配置 1、zookeeper.connect 该参数用于配置Kafka要连接的Zookeeper/集群的地址。它的值是一个字符串&#xff0c;使用逗号分隔Zookeeper的多个地址。Zookeeper的单个地址是host:port形式的&#xff0c;可以在最后添加Kafka在Zoo…

idea+docker+jenkins+git构建自动化部署java项目

ideadockerjenkinsgit构建自动化部署java项目 默认jenkins已经 安装jdk 9 和maven 3.5 用于 执行pom.xml 打包构建镜像 [rootECS40833040 ~]# mkdir -p /usr/local/jenkins [rootECS40833040 jenkins]# vim jenkins.sh #!/usr/bin/env bash app_name005-springboot docker …

2、JSP——配置Tomcat服务器

目录 1、下载Tomcat服务器 2、Tomcat服务器的安装 3、Tomcat的目录结构 4、配置Tomcat运行环境 4.1 右击此电脑--->属性--->高级系统设置--->环境变量 4.2 在系统变量(s)中新建--->CATALINA_HOME--->变量值为Tomcat压缩文件解压后的地址 4.3 在系统变量(s…