Java设计模式中的组合模式

 更新时间:2022年07月19日 09:17:18   作者:爱学习的大鱼  
这篇文章主要介绍了Java设计模式中的组合模式,组合模式依据树形结构来组合对象,用来表示部分以及整体层次,种类型的设计模式属于结构型模式

模式介绍

  • 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体_部分”的层次关系。
  • 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
  • 这种类型的设计模式属于结构型模式。
  • 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一-致的方式处理个别对象以及组合对象

UML类图

类图解析:

  • Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理。Component子部件, Component可以是抽象类或者接口。
  • Leaf:在组合中表示叶子节点,叶子节点没有子节点
  • Composite :非叶子节点,用于存储子 部件,在 Component接口中实现子部件的相关操作,比如增加(add),删除(delete)。

组合模式案例

背景介绍:一所大学包含多个学院,学院又包含多个学科专业

OrganizationComponent(抽象类)

public abstract class OrganizationComponent {
    private String name;
    private String des;
    /**
     * 默认实现
     * @param o
     */
    protected void add(OrganizationComponent o) {
        throw new UnsupportedOperationException("该方法不支持");
    }
    protected void remove(OrganizationComponent o) {
        throw new UnsupportedOperationException("该方法不支持");
    }
    public OrganizationComponent(String name, String des) {
        this.name = name;
        this.des = des;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

    /**
     * 打印方法
     */
    protected abstract void print();
}

Department(专业类)

public class Department extends OrganizationComponent{
    public Department(String name, String des) {
        super(name, des);
    }
    @Override
    protected void print() {
        System.out.println(getName());
    }
}

College(学院类)

public class College extends OrganizationComponent {
    List<OrganizationComponent> departments = new ArrayList<>();

    public College(String name, String des) {
        super(name, des);
    }
    @Override
    protected void add(OrganizationComponent o) {
        departments.add(o);
    }
    @Override
    protected void remove(OrganizationComponent o) {
        departments.remove(o);
    }
    @Override
    protected void print() {
        System.out.println("-----------" + getName() + "-----------");
        departments.forEach(OrganizationComponent::print);
    }
}

University(大学类)

public class University extends OrganizationComponent {
    List<OrganizationComponent> colleges = new ArrayList<>();

    public University(String name, String des) {
        super(name, des);
    }

    @Override
    protected void add(OrganizationComponent o) {
        colleges.add(o);
    }

    @Override
    protected void remove(OrganizationComponent o) {
        colleges.remove(o);
    }
    @Override
    protected void print() {
        System.out.println("-----------" + getName() + "-----------");
        colleges.forEach(OrganizationComponent::print);
    }
}

Client(测试类)

public class Client {
    public static void main(String[] args) {
        // 创建大学
        University university = new University("清华大学", "中国顶级大学");

        // 计算机学院
        College computerCollege = new College("计算机学院", "计算机学院");
        College infoEngineerCollege = new College("信息工程学院", "信息工程学院");
        // 创建专业 并添加
        computerCollege.add(new Department("软件工程","软件工程不错"));
        computerCollege.add(new Department("网络工程","网络工程不错"));
        computerCollege.add(new Department("计算机科学与技术","计算机科学与技术老牌专业"));

        infoEngineerCollege.add(new Department("通信工程","通信工程不好学"));
        infoEngineerCollege.add(new Department("信息工程","信息工程好学"));

        // 添加学院到大学
        university.add(computerCollege);
        university.add(infoEngineerCollege);

        // 打印
        university.print();
    }
}

实现结果:

组合模式的注意事项和细节

  • 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
  • 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动。
  • 方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构。
  • 需要遍历组织机构,或者处理的对象具有树形结构时,非常适合使用组合模式
  • 要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式。

到此这篇关于Java设计模式中的组合模式的文章就介绍到这了,更多相关Java组合模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring 单元测试中如何进行 mock的实现

    Spring 单元测试中如何进行 mock的实现

    这篇文章主要介绍了Spring 单元测试中如何进行 mock的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java中@ConfigurationProperties实现自定义配置绑定问题分析

    Java中@ConfigurationProperties实现自定义配置绑定问题分析

    这篇文章主要介绍了@ConfigurationProperties实现自定义配置绑定问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 在SpringBoot项目中实现读写分离的流程步骤

    在SpringBoot项目中实现读写分离的流程步骤

    SpringBoot作为一种快速开发框架,广泛应用于Java项目中,在一些大型应用中,数据库的读写分离是提升性能和扩展性的一种重要手段,本文将介绍如何在SpringBoot项目中优雅地实现读写分离,并通过适当的代码插入,详细展开实现步骤,同时进行拓展和分析
    2023-11-11
  • 异常点/离群点检测算法——LOF解析

    异常点/离群点检测算法——LOF解析

    这篇文章主要介绍了异常点/离群点检测算法——LOF解析,通过图解文字描述的方式详细的解析了该算法,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • IDEA JavaWeb项目启动运行后出现404错误的解决方法

    IDEA JavaWeb项目启动运行后出现404错误的解决方法

    这篇文章主要介绍了IDEA JavaWeb项目启动运行后出现404错误的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java经典排序算法之归并排序详解

    Java经典排序算法之归并排序详解

    这篇文章主要为大家详细介绍了Java经典排序算法之归并排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • JUC之Semaphore源码分析

    JUC之Semaphore源码分析

    这篇文章主要为大家详细分析了JUC之Semaphore源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • ArrayList详解和使用示例_动力节点Java学院整理

    ArrayList详解和使用示例_动力节点Java学院整理

    ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。接下来通过本文给大家介绍arraylist详解和使用示例代码,需要的的朋友一起学习吧
    2017-05-05
  • 关于Java中properties文件编码问题

    关于Java中properties文件编码问题

    这篇文章主要介绍了关于Java中properties文件编码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java.lang.Void类源码解析

    java.lang.Void类源码解析

    这篇文章主要介绍了java.lang.Void类源码解析的相关内容,对源码中的部分内容进行解释,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10

最新评论