Java实现树形结构管理的组合设计模式

目录
  • 介绍
  • 实现
    • 抽象构件
    • 叶子节点
    • 组合节点
    • 测试
  • 总结
    • 优点
    • 缺点
    • 应用场景

介绍

Java组合模式(Composite Pattern)是一种结构型设计模式,允许你将对象组合成树状结构,并且能像使用独立对象一样使用它们.

组合模式包含以下3种角色:

  • 抽象构建(Component):是组合中对象声明接口,可以包含其他对象,可以定义公共行为和管理子对象的方法.
  • 叶子节点(Leaf):是组合中的简单对象,没有包含其他对象的能力.
  • 组合节点(Composite):有叶子节点和组合节点作为子节点的对象,通常会把子节点存储到一个结合中,实现抽象构建接口中的方法.

组合模式的核心思想是将叶子节点和组合节点看作同一种类型的对象,让它们拥有相同的接口,从而在使用时能够无差别对待.

实现

假设我们正在编写一个文件系统的程序,需要实现对目录和文件的管理.我们可以使用组合模式来处理这种问题.

抽象构件

public abstract class AbstractFile {
    protected String name;
    public AbstractFile(String name) {
        this.name = name;
    }
    /**
     * 输入文件名;包含节点下的子节点
     */
    public abstract void display();
    /**
     * 添加文件
     * @param file
     */
    public abstract void add(AbstractFile file);
    /**
     * 删除文件
     * @param file
     */
    public abstract void remove(AbstractFile file);
}

叶子节点

public class File extends AbstractFile {
    public File(String name) {
        super(name);
    }
    /**
     * 输入文件名;包含节点下的子节点
     */
    @Override
    public void display() {
        System.out.println("这是文件:" + name);
    }
    /**
     * 添加文件
     *
     * @param file
     */
    @Override
    public void add(AbstractFile file) {
        throw new UnsupportedOperationException("文件不支持添加操作");
    }
    /**
     * 删除文件
     *
     * @param file
     */
    @Override
    public void remove(AbstractFile file) {
        throw new UnsupportedOperationException("文件不支持删除操作");
    }
}

组合节点

public class Directory extends AbstractFile {
    private List<AbstractFile> fileList = new ArrayList<>();
    public Directory(String name) {
        super(name);
    }
    @Override
    public void add(AbstractFile file) {
        fileList.add(file);
    }
    @Override
    public void remove(AbstractFile file) {
        fileList.remove(file);
    }
    /**
     * 输入文件名;包含节点下的子节点
     */
    @Override
    public void display() {
        System.out.println("这是目录:" + name);
        fileList.forEach(AbstractFile::display);
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        AbstractFile root = new Directory("根目录");
        AbstractFile file1 = new File("文件1");
        AbstractFile file2 = new File("文件2");
        AbstractFile file3 = new File("文件3");
        AbstractFile file4 = new File("文件4");
        AbstractFile directory1 = new Directory("目录1");
        AbstractFile directory2 = new Directory("目录2");
        directory1.add(file1);
        directory1.add(file2);
        directory1.add(directory2);
        directory2.add(file3);
        directory2.add(file4);
        root.add(directory1);
        root.display();
    }
}

以上代码是一个完整的Java组合模式的示例,实现了一个简单的文件系统结构.根据文件和目录的特点,将其抽象为AbstractFile类,并定义了name属性以及抽象方法add();remove();display()并实现了两个具体的子类File和Directory.

在Directory类中,使用了一个List来储存文件和子目录,实现了add()和remove()方法,可以像其中添加和删除文件和子目录.同时display()方法遍历并打印出其子节点信息.

在File类中,由于文件没有子节点,因此在add()和remove()方法中抛出了UnsupportedOperationException异常,同时display()直接打印出文件信息.

总结

组合模式是一种结构型设计模式,允许我们将对象组合成属性结构来表现整体/部分层次结构,使得用户对单个对象和组合对象使用具有一致性.

优点

  • 简化客户端代码:客户端无需知道处理的是单个对象还是组合对象,统一处理方式使得客户端代码更加简单.
  • 增加新组件方便:在组合模式中增加新的叶子或组合对象都非常容易.
  • 灵活性:可以很容易地扩展属性结构,增加或删除组件,不需要修改现有代码.

缺点

  • 可能会引起系统过于抽象:过度使用组合模式会导致系统过于抽象,增加了系统的复杂度.
  • 可能会带来性能问题:在处理深层次嵌套的组合对象时,可能会导致性能问题.

应用场景

组合模式常用于处理整体/部分层次结构的问题,适用于以下场景:

  • 需要表示一个对象整体与部分层次结构,如树形菜单,文件夹等.
  • 需要对客户端统一处理单个对象和组合对象.
  • 需要简化客户端代码,使其更易于使用.

到此这篇关于Java实现树形结构管理的组合设计模式的文章就介绍到这了,更多相关Java组合模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java设计模式之组合模式深入刨析

    目录 1.基本介绍 2.结构 3.组合模式解决的问题 4.组合模式解决学校院系展示 5.组合模式的注意事项和细节 1.基本介绍 1)组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系 2)组合模式依据树形结构来组合对象,用来表示部分以及整体层次 3)这种类型的设计模式属于结构型模式 4)组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象 2.结构 组

  • Java设计模式之组合模式

    本文通过老王和小王探讨书房.书架.各类书的管理问题,引出结构型设计模式家族中的一个重要成员——组合模式,本文会给予两种组合模式的典型代码实现,为了加深理解会在第三部分应用中介绍组合模式在源码中的实际运用,最后总结该设计模式学习后的一些思考. 读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到码云,本地源码下载. 一.引出问题 上篇文章中老王给小王买车以后,小王对老王感激涕零,看着老王凌乱的书房,小王提出要帮助老王整理整理他的书架. 小王开始了他的分析.老王平时博览群书,中文.英文.梵

  • Java设计模式之组合模式的示例详解

    目录 定义 原理类图 案例 需求 方案 分析 总结 定义 组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性 原理类图 Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口 leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构 Composite

  • Java结构型设计模式之组合模式详解

    目录 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 组合模式 组合模式(Composite Pattern)也称为整体-部分(Part-Whole)模式,属于结构型模式. 它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户端对单个对象和组合对象的使用具有一致性. 组合模式一般用来描述整体与部分的关系,它将对象

  • Java结构型设计模式之组合模式Composite Pattern详解

    目录 概述 三大组件 应用案例 顶层组件OrganizationComponent Composite组件 叶子节点 客户端测试 UML类图 总结 概述 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系.组合模式依据树形结构来组合对象,用来表示部分以及整体层次. 这种类型的设计模式属于结构型模式. 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象

  • 深入理解Java设计模式之组合模式

    目录 一.什么是组合模式 动机(Motivation) 意图(Intent) 二.组合模式的结构 结构图说明: 三.组合模式的使用场景 四.组合模式的优缺点 五.组合模式的实现 六.组合模式的.NET下应用 一.什么是组合模式 定义:将对象以树形结构组织起来,以达成"部分-整体"的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 动机(Motivation) 客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带

  • Java设计模式中的组合模式

    目录 模式介绍 UML类图 组合模式案例 组合模式的注意事项和细节 模式介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体_部分”的层次关系. 组合模式依据树形结构来组合对象,用来表示部分以及整体层次. 这种类型的设计模式属于结构型模式. 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一-致的方式处理个别对象以及组合对象 UML类图 类图解析: Component :这是组合中对象声明接口,

  • Java数据封装树形结构代码实例

    这篇文章主要介绍了Java数据封装树形结构代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.实体类 @data public class PublishServiceType implements Comparable<PublishServiceType>{ /** * */ private static final long serialVersionUID = -3572108154932898825L; /* * @see

  • java转树形结构工具类详解

    本文实例为大家分享了java转树形结构工具类的具体代码,供大家参考,具体内容如下 import com.alibaba.fastjson.JSON; import lombok.Data; import lombok.ToString; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import java.lang.reflect.Field; impor

  • Java实现树形结构的示例代码

    目录 前言 数据库表结构 实现思路 具体代码 1.造数据,和数据库表数据一致 2.树型结构实体类 前言 由于业务需要,后端需要返回一个树型结构给前端,包含父子节点的数据已经在数据库中存储好,现在需要做的是如何以树型结构的形式返给给前端. 数据库表结构 实现思路 1.拿到有父子节点的集合数据 2.遍历集合数据,拿到所有的根节点 3.遍历根节点,拿到所有的子节点 4.递归子节点,将递归的子节点接上其父节点,直到子节点为空,递归完成 5.递归好后以集合形式返回,返回前端时以JSON格式转换后返回 具体

  • Java创建树形结构算法实例代码

    在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBean import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import j

  • Java接口返回省市区树形结构的实现

    目录 前言 设计表结构 Java代码 调用接口查看结果 前言 最近和前端联调接口,需要进行一个省市区联动,最终定的方案是通过接口返回一个树形结构给前端,类似这样的结构: 下面就把相关表和代码分享给大家 设计表结构 表结构已经准备好了,直接执行即可. 由于数据量较大,这里放不下,需要的伙伴们可以私聊我 CREATE TABLE `sys_region` ( `id` int(19) NOT NULL AUTO_INCREMENT COMMENT 'id', `pid` int(19) NULL D

  • IOS设计模式之组合设计模式

    Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类. 组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 通过本文将让你学会软件开发中的"何为树形结构"."何为组合模式"."组合模式可以解决的问题"等相关知识. 内容大纲: 1.树形结构 2.组合模式 3.编写文件

  • 详解组合模式的结构及其在Ruby设计模式编程中的运用

    定义:也叫合成模式,或者部分-整体模式,主要是用来描述部分与整体的关系,定义,将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 类图: 角色说明: Componnent抽象构件角色:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. Leaf叶子构件:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位. Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构. 实例: 听说你们公司最近新

  • java、js中实现无限层级的树形结构方法(类似递归)

    js中: var zNodes=[ {id:0,pId:-1,name:"Aaaa"}, {id:1,pId:0,name:"A"}, {id:11,pId:1,name:"A1"}, {id:12,pId:1,name:"A2"}, {id:13,pId:1,name:"A3"}, {id:2,pId:0,name:"B"}, {id:21,pId:2,name:"B1&qu

  • Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

  • 使用递归算法结合数据库解析成Java树形结构的代码解析

    1.准备表结构及对应的表数据 a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b.表数据: insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0); insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1); insert into tb_tree

随机推荐