【设计模式】Java设计模式-组合模式

Java设计模式 – 组合模式

😄 不断学习才是王道
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆原创作品,更多关注我CSDN: 一个有梦有戏的人
👊准备将博客园、CSDN一起记录分享自己的学习心得!!!
🌝分享学习心得,欢迎指正,大家一起学习成长!

【设计模式】Java设计模式-组合模式

简介

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

组合模式原理

首先先看一下组合的UML图

【设计模式】Java设计模式-组合模式

Compoent:抽象类或者接口,是组合对象声明的接口,实现所有类的默认行为,用于访问、管理子部件。
Leaf:组合中的叶子节点,最小的类
Composite:非叶子节点,用来操作组合对象,存储子部件。

组合模式实例

接下来用一个例子来学习组合模式,学校有学院,学院下有专业,这就是一层一层的关系,需要在一个页面中展现出那个学校有什么学院,学院下有什么专业。
来看一下例子的类图

【设计模式】Java设计模式-组合模式

①、定义抽象类-Component

定义属性,构造器,getset,操作方法需要默认实现,因为在叶子节点是不需要去实现的,如果定义成抽象类,子类就必须实现了。在定义一个抽象类-打印信息。

package com.lyd.demo.composite;

/**
 * @Author: lyd
 * @Description: 抽象类
 * @Date: 2022-08-30
 */
public abstract class OrganizationComponent {
    private String name;
    private String description;
    public OrganizationComponent(String name, String description) {
        this.name = name;
        this.description = description;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    // 添加 - 子类不一定需要实现
    public void add(OrganizationComponent organizationComponent) {
        throw new UnsupportedOperationException();
    }
    // 删除 - 子类不一定需要实现
    public void remove(OrganizationComponent organizationComponent) {
        throw new UnsupportedOperationException();
    }
    // 打印 - 子类必须去实现
    public abstract void print();
}

②、定义叶子类和非叶子类

大学类:非叶子,组合 院系类;定义一个数组来存放组合对象,通过重写操作方法对其进行操作。

package com.lyd.demo.compose;
import com.lyd.demo.composite.OrganizationComponent;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author: lyd
 * @Description: 学校类 - 继承OrganizationComponent - 组合 院系类
 * @Date: 2022-08-30
 */
public class University extends OrganizationComponent {
    // 组合 College 类
    List organizationComponents = new ArrayList();
    public University(String name, String description) {
        super(name, description);
    }
    /**
     * 重写add
     */
    @Override
    public void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }
    /**
     * 重写remove
     */
    @Override
    public void remove(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }
    @Override
    public String getName() {
        return super.getName();
    }
    @Override
    public String getDescription() {
        return super.getDescription();
    }
    // 打印包含学院的信息
    @Override
    public void print() {
        System.out.println("< " + getName() + " >");
        // 将所有学院信息打印出来
        for (OrganizationComponent o : organizationComponents) {
            o.print();
        }
    }
}

学院类:非叶子,组合Department类,定义一个数组来存放组合对象,通过重写操作方法对其进行操作。

package com.lyd.demo.compose;
import com.lyd.demo.composite.OrganizationComponent;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author: lyd
 * @Description: 学院类
 * @Date: 2022-08-30
 */
public class College extends OrganizationComponent {
    // 组合 Department 类
    List organizationComponents = new ArrayList();
    public College(String name, String description) {
        super(name, description);
    }
    /**
     * 重写add
     */
    @Override
    public void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }
    /**
     * 重写remove
     */
    @Override
    public void remove(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }
    @Override
    public String getName() {
        return super.getName();
    }
    @Override
    public String getDescription() {
        return super.getDescription();
    }
    // 打印包含学院的信息
    @Override
    public void print() {
        System.out.println("< " + getName() + " >");
        // 将所有专业信息打印出来
        for (OrganizationComponent o : organizationComponents) {
            o.print();
        }
    }
}

专业类:叶子节点,没有组合的集合,所以不需要进行操作,只需要进行输出打印。

package com.lyd.demo.compose;
import com.lyd.demo.composite.OrganizationComponent;
/**
 * @Author: lyd
 * @Description: 专业类
 * @Date: 2022-08-30
 */
public class Department extends OrganizationComponent {
    // 已经没有集合了
    public Department(String name, String description) {
        super(name, description);
    }
    @Override
    public String getName() {
        return super.getName();
    }
    @Override
    public String getDescription() {
        return super.getDescription();
    }
    // 叶子节点,就不需要add和remove
    @Override
    public void print() {
        System.out.println(getName());
    }
}

③、测试

package com.lyd.demo.test;
import com.lyd.demo.compose.College;
import com.lyd.demo.compose.Department;
import com.lyd.demo.compose.University;
import com.lyd.demo.composite.OrganizationComponent;
/**
 * @Author: lyd
 * @Description: 测试
 * @Date: 2022-08-30
 */
public class ComposeTest {
    public static void main(String[] args) {
        // 创建大学
        OrganizationComponent ZheJiangUniversity = new University("浙江大学", "人才之地");
        // 创建学院
        OrganizationComponent ComputerCollege = new College("计算机科学与技术学院", "-->计算机科学与技术学院");
        OrganizationComponent OpticalCollege = new College("光电科学与工程学院", "-->光电科学与工程学院");
        // 创建专业
        Department ComputerDepartment = new Department("计算机科学与技术", "--计算机科学与技术");
        Department SoftWareDepartment = new Department("软件工程", "--软件工程");
        Department OpticalDepartment = new Department("光电信息科学与工程", "--光电信息科学与工程");
        // 添加专业
        ComputerCollege.add(ComputerDepartment);
        ComputerCollege.add(SoftWareDepartment);
        OpticalCollege.add(OpticalDepartment);
        // 添加学院
        ZheJiangUniversity.add(ComputerCollege);
        ZheJiangUniversity.add(OpticalCollege);
        // 打印所有
        ZheJiangUniversity.print();
        System.out.println("*******************************");
        // 打印学院
        ComputerCollege.print();
        System.out.println("*******************************");
        // 打印院系
        ComputerDepartment.print();
    }
}

组合可以理解成是层层相套。
运行结果:

【设计模式】Java设计模式-组合模式

通俗的讲,组合模式就是将对象组合到非类中,在非子类中进行对他们的操作,有种层层相套的感觉,可以通过打断点的形式一步一步了解。

👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍

Original: https://www.cnblogs.com/lyd-code/p/16686350.html
Author: 怒放吧德德
Title: 【设计模式】Java设计模式-组合模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574128/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • redis集群部署

    Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式…

    Linux 2023年6月7日
    094
  • python openpyxl UserWarning: Workbook contains no default style, apply openpyxl‘s default

    告警解释 这是一个告警,这个excel文件没有设置默认的样式。一般这种没有默认样式的excel文档是由java程序生成的,不是像windows系统日常使用中通过右键点击创建的exc…

    Linux 2023年6月8日
    093
  • php uniapp 支付宝app支付,前后端实战源码

    uniapp端,前端代码 app.php端代码 Original: https://www.cnblogs.com/xiaofengzheng/p/16457966.htmlAut…

    Linux 2023年6月7日
    082
  • redis高级

    1 redis高可用 主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master—>哨兵 2 主从复制,只能主…

    Linux 2023年6月14日
    089
  • 详解Docker 跨服务器通讯 Ambassador原理

    先看拓扑图:Ambassador 主要用来解决跨服务器通讯,因为同服务器通讯相对简单,直接用–link参数,或者用bridge网络即可。 服务器B的Docker2:ce…

    Linux 2023年6月6日
    0106
  • WEB自动化-04-Cypress 测试用例编写和组织

    4 测试用例编写和组织 4.1 用例结构 Cypress是建立在 Mocha和 Chai之上,因此同时支持Chai的 BDD和 TDD两种风格。如果你熟悉JavaScript风格的…

    Linux 2023年6月7日
    0113
  • 搭建docker镜像仓库(一):使用registry搭建本地镜像仓库

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    086
  • 唯一主键方案之数据库维护区间分配

    我们介绍一种基于数据库维护自增 ID 区间,结合内存分配的策略,这也是淘宝的 TDDL 等数据库中间件使用的主键生成策略。 使用这种方式首先在数据库中创建 sequence 表,其…

    Linux 2023年6月16日
    0212
  • GCC 内联汇编基础

    GCC 内联汇编 在 MIT6.828的实验中,有几处用到了很底层的函数,都以内联汇编的形式存在,例如 static inline uint32_t read_esp(void) …

    Linux 2023年6月8日
    085
  • 深入理解linux内核-内存寻址

    逻辑地址:由一个段和偏移量组成的地址线性地址(虚拟地址):物理地址:CPU的物理地址线相对应的地址32或36位 多处理器系统中每个CPU对应一个GDT 局部线程存储:用于线程内部的…

    Linux 2023年6月6日
    080
  • GFS-Google 文件系统

    GFS分布式文件系统 简介 GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体…

    Linux 2023年6月13日
    089
  • Ubuntu下使用apt-get命令查询并安装指定版本的软件

    执行以下命令,查询软件所有的版本号 sudo apt-cache madison <package></package> 执行以下命令,安装指定版本的软件 …

    Linux 2023年6月6日
    0105
  • linux下应用程序界面初始位置及鼠标拖动失效

    故事背景:最近在适配uos系统,客户端程序启动初始位置乱跳,并不是我设置的屏幕中间,鼠标拖动失效,一度怀疑自己的代码有问题,开始我们的探险之路吧。。。 探索之路:后来goolge发…

    Linux 2023年6月13日
    0115
  • 文件权限问题导致plink报错 Failed to open 21JAN.log. Try changing the –out parameter.

    晚上兴起,想起一直以来没有解决的问题,于是复制一个目录,开始跑数据,但是跑到第一步就采坑 plink –chr-set 95 –file merge &#8…

    Linux 2023年6月14日
    0138
  • Mysql 安全加固经验总结

    本文为博主原创,转载请注明出处: 1.内网部署Mysql mysql 数据库在使用过程中,需要给服务提供连接和访问的权限,而不需要进行公网连接和访问,所以在安全环境和现网环境部署m…

    Linux 2023年6月14日
    094
  • k8s之部署metrics-server 转载

    Metrics Server是Kubernetes内置自动缩放管道的可扩展,高效的容器资源指标来源。 Metrics Server从Kubelet收集资源指标,并通过Metrics…

    Linux 2023年6月14日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球