【设计模式-8】组合模式的树形结构实现原理和代码演示

这篇具有很好参考价值的文章主要介绍了【设计模式-8】组合模式的树形结构实现原理和代码演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 组合模式是在处理树形结构时而经常使用的设计模式,树形结构一般是由很多节点对象组合而成的一个整体。我们在开发中经常会碰到这样的结构,比如二叉树、多叉树等,映射到真实生活场景中的书的目录结构,部门的层级结构或者是电脑中的文件目录结构等。

1. 概述

组合模式 是针对树形结构而发展出来的一种设计模式,树形结构是由节点对象组合而成的对象,呈现“个体-整体”的结构,这种模式可以使客户端在操作树形结构的整体或者个体节点对象时,能做出统一的响应,这种整体和个体的概念对客户端来说也是不可见的。

组合模式 可以很好的做到,复杂树形对象的层次结构与客户端解耦的目的,是一种结构性的设计模式。

【设计模式-8】组合模式的树形结构实现原理和代码演示,设计模式,设计模式,组合模式,python
 在组合模式中,通常存在三个角色:

  • 抽象构件:一般是接口或者抽象类,声明了子类的方法和属性。子类可以是一个叶子构件 ,也可以是一个容器构件。
  • 叶子构件:实现了抽象构件的接口,位于树形结构中最末端的构件,不能包含其他组件,它需要实现了抽象构件所有的方法。
  • 容器构件:实现了抽象构件的接口,表示容器节点对象,可以存放其他的容器构件对象或者叶子构件对象,在具体业务方法中可以通过递归的方式实现对子节点的遍历。

2. 代码实现

 下面,我们通过一个电脑中文件目录树形结构的例子,来写一个组合模式的Demo案例,具体代码如下:

  • 抽象构件
// 抽象的构件
public abstract class AbstractNode {
    // 节点名称
    protected String name;
    // 构造的文件名称
    AbstractNode(String name) {
        this.name = name;
    }

    // 添加节点的方法
    protected abstract void add(AbstractNode abstractNode);
    // 展示节点的方法
    protected void show(int lines) {
        StringBuilder sb = new StringBuilder("|");
        for (int i = 0; i < lines; i++) {
            sb.append("—— ");
        }
        sb.append(name);
        System.out.println(sb);
    }
}
  • 叶子节点 - 文件
// 叶子节点 - 文件
public class File extends AbstractNode {
    // 构造函数
    File(String name) {
        super(name);
    }

    @Override
    protected void add(AbstractNode abstractNode) {
        // 可以通过抛出异常表示子节点不支持的方法
        throw new RuntimeException("叶子构件不支持添加新的节点");
    }

    @Override
    protected void show(int lines) {
        // 调用父类的方法
        super.show(lines);
    }
}
  • 容器节点 - 文件夹
// 容器节点 - 文件夹
public class Folder extends AbstractNode{
    // 文件夹下面的子节点(包含容器节点和叶子节点)
    private List<AbstractNode> list;
    // 构造函数默认赋值
    public Folder(String name) {
        super(name);
        this.list = new ArrayList<>();
    }

    @Override
    protected void add(AbstractNode abstractNode) {
        list.add(abstractNode);
    }

    @Override
    protected void show(int lines) {
        // 先展示名称
        super.show(lines);
        // 节点展示 + 1
        lines ++;
        // 子节点的展示
        for (AbstractNode node : list) {
            node.show(lines);
        }
    }
}
  • 客户端
// 客户端
public class Client {
    public static void main(String[] args) {
        // 定义文件夹
        AbstractNode folder = new Folder("D盘");
        folder.add(new File("日记.txt"));
        folder.add(new File("人民的名义.mp4"));

        // 添加子文件夹
        AbstractNode sonFolder1 = new Folder("音乐");
        sonFolder1.add(new File("周杰伦.mp3"));
        sonFolder1.add(new File("以父之名.mp3"));
        AbstractNode music = new Folder("张杰");
        music.add(new File("年轻的战场.mp3"));
        sonFolder1.add(music);
        AbstractNode sonFolder2 = new Folder("图片");
        sonFolder2.add(new File("快看这是美景图.jpeg"));
        folder.add(sonFolder1);
        folder.add(sonFolder2);
        // 文件展示
        folder.show(0);
    }
}

 执行的结果如下展示:

【设计模式-8】组合模式的树形结构实现原理和代码演示,设计模式,设计模式,组合模式,python

3. UML类图

 根据上面这个代码demo,我们来画一下对应的UML类图吧。

【设计模式-8】组合模式的树形结构实现原理和代码演示,设计模式,设计模式,组合模式,python

4. 模式分类

 根据抽象构件中定义的方法,可以分为透明组合模式和安全组合模式两种

  • 透明组合模式:在抽象构建中声明了所有管理成员的方法,包含增加、删除、获取、管理等方法,子类需要全部实现。
  • 安全组合模式:在抽象构件中只定义关于操作的方法,由子类单独生命成员额增加、删除或者管理等方法。

5. 总结

 我们来总结一下,组合模式的主要优点:文章来源地址https://www.toymoban.com/news/detail-817471.html

  1. 首先组合模式使得客户端可以统一使用组合的结构对象来处理叶子或者容器节点,而不必关系对象的特征,对调用方比较友好。
  2. 组合模式中添加新的容器构件和叶子构件都很方便,无需改动现有类结构,符合开闭原则。

到了这里,关于【设计模式-8】组合模式的树形结构实现原理和代码演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【地铁上的设计模式】--结构型模式:组合模式

    什么是组合模式 组合模式是一种结构型设计模式,将对象组合成树形结构,以表示部分整体的层次结构,让用户对单个对象和组合对象的使用具有一致性。 在组合模式中,抽象构件定义了一个统一的接口,用于管理所有对象,叶子节点和组合节点都实现了该接口。叶子节点

    2024年02月02日
    浏览(42)
  • Java23种设计模式-结构型模式之组合模式

    组合模式 (Composite Pattern):将 对象组合成树状结构 以表示“ 部分-整体 ”层次结构,同时保持对单个对象和组合对象的一致性操作,主要目的是简化客户端代码,因为它可以统一处理单个对象和组合对象。 通常包含以下几个角色: 角色1. 抽象组件 (Component):声明了 组

    2024年04月26日
    浏览(41)
  • Java设计模式之结构型-组合模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、菜单遍历  五、总结  组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。 角色 描述

    2024年02月16日
    浏览(51)
  • 【设计模式】组合模式实现部门树实践

    几乎在每一个系统的开发过程中,都会遇到一些 树状 结构的开发需求,例如:组织机构树,部门树,菜单树等。只要是需要开发这种树状结构的需求,我们都可以使用组合模式来完成。 本篇将结合组合模式与 Mysql 实现一个部门树,完成其增删改和树形结构的组装。 组合模

    2024年02月09日
    浏览(62)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(52)
  • 组合模式:构建灵活的树形结构

    组合模式(Composite Pattern)是一种广泛应用于软件开发中的设计模式,旨在通过树形结构来表示对象的部分-整体层次。这种模式允许用户以一致的方式处理单个对象和对象组合,从而简化了复杂结构的处理过程。在本文中,我们将通过Java语言的例子来详细探讨组合模式的概念

    2024年04月10日
    浏览(31)
  • 篇九:组合模式:树形结构的力量

    篇九: “组合模式:树形结构的力量” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。 链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd

    2024年02月13日
    浏览(30)
  • 用Rust实现23种设计模式之 组合模式

    组合模式是一种结构型设计模式,它允许将对象组合成树状结构,并且能够以统一的方式处理单个对象和组合对象。以下是组合模式的优点和使用场景: 简化客户端代码 :组合模式通过统一的方式处理单个对象和组合对象,使得客户端无需区分它们,从而简化了客户端代码

    2024年02月14日
    浏览(47)
  • Python入门【​编辑、组合、设计模式_工厂模式实现 、设计模式_单例模式实现、工厂和单例模式结合、异常是什么?异常的解决思路 】(十七)

    👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🔥如果感觉博主的文章还不错的

    2024年02月14日
    浏览(44)
  • 设计模式- 代理模式(Proxy Pattern)结构|原理|优缺点|场景|示例

                                        设计模式(分类)        设计模式(六大原则)        创建型(5种)         工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式     结构型(7种)      

    2024年04月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包