Java设计模式中组合模式是什么/树形结构怎么组合或显示存储,编程怎么实现树形结构

news2024/10/6 19:08:03

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

5.7 组合模式

5.7.1 概述

  • 又名整体模式,是用于把一组相似的对象当作一个单一的对象
  • 依据树形结构来组合对象,用来表示部分以及整体层次
  • 属于结构型模式,创建了对象组的树形结构

5.7.2 结构

  • 抽象根节点(Component):定义系统各层次对象的共有方法和属性,可以预先定义一些默认行为和属性
  • 树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构
  • 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最小单位

5.7.3 案例

  • 菜单组件(抽象根节点)
public abstract class MenuComponent {  
//    菜单组件名称  
   protected String name;  
//    菜单组件的层级  
   protected int level;  
//    添加子菜单  
   public void add(MenuComponent menuComponent){  
       throw new UnsupportedOperationException();  
   }  
//    移除子菜单  
   public void remove(MenuComponent menuComponent){  
       throw new UnsupportedOperationException();  
   }  
//    获取指定的子菜单  
   public MenuComponent getChild(MenuComponent menuComponent){  
       throw new UnsupportedOperationException();  
   }  
//    获取菜单或菜单项名称  
   public String getName(){  
       return name;  
   }  
//    打印菜单名称(包括子菜单和子菜单项)  
   public abstract void print();
}
  • 菜单类-树枝节点
public class Menu extends MenuComponent{  
//    菜单可由多个子菜单或子菜单项  
   private List<MenuComponent> componentList = new ArrayList<>();  
//    构造方法  
   public Menu(String name,int level){  
       this.name = name;  
       this.level = level;  
   }  
   @Override  
   public void add(MenuComponent menuComponent) {  
       componentList.add(menuComponent);  
   }  
   @Override  
   public void remove(MenuComponent menuComponent) {  
       componentList.remove(menuComponent);  
   }  
   @Override  
   public MenuComponent getChild(int index) {  
       return componentList.get(index);  
   }  
   @Override  
   public void print() {  
//        打印菜单名称  
       for(int i = 0;i < level;i ++)  
           System.out.print("--");  
       System.out.println(name);  
//        打印子菜单或子菜单项名称  
       for (MenuComponent component : componentList) {  
           component.print();  
       }  
   }  
}
  • 叶子节点-子菜单项
public class MenuItem extends MenuComponent{  
    public MenuItem(String name,int level) {  
        this.name=name;  
        this.level  = level;  
    }  
    @Override  
    public void print() {  
//        打印菜单项名称  
        for(int i = 0;i < level;i ++)  
            System.out.print("--");  
        System.out.println(name);  
    }  
}
  • 测试
    public static void main(String[] args) {  
//        设置菜单树  
        MenuComponent menu1 = new Menu("菜单管理",2);  
        menu1.add(new MenuItem("页面访问",3));  
        menu1.add(new MenuItem("展开菜单",3));  
        menu1.add(new MenuItem("编辑菜单",3));  
        menu1.add(new MenuItem("新增菜单",3));  
        MenuComponent menu2 = new Menu("权限管理",2);  
        menu2.add(new MenuItem("页面访问",3));  
        menu2.add(new MenuItem("提交保存",3));  
        menu2.add(new MenuItem("提交保存",3));  
        MenuComponent menu3 = new Menu("角色管理",2);  
        menu3.add(new MenuItem("页面访问",3));  
        menu3.add(new MenuItem("新增角色",3));  
        menu3.add(new MenuItem("修改角色",3));  
//      设置一级菜单  
        MenuComponent component = new Menu("系统管理",1);  
        component.add(menu1);  
        component.add(menu2);  
        component.add(menu3);  
//      打印菜单名称  
        component.print();  
    }
  • 结果![[Pasted image 20230104224937.png]]

5.7.4 分类

根据抽象构件类定义形式,可分为透明组合模式和安全组合模式

5.7.4.1 透明组合模式

  • 抽象根节点角色声明了所有用于管理成员对象的方法
  • 是组合模式的标准模式
  • 不够安全,因叶子对象和容器对象在本质上是有去别的,叶子对象不可能有下一个层次对象,即不可能包含成员对象,故为其提供add()、remove()方法是没意义的,在编译阶段不会出错,但在运行阶段若调用这些方法则会出错

5.7.4.2 安全组合模式

  • 在抽象构件角色中没有声明任何用于管理成员对象方法,而在树枝结点Menu类中声明并实现这些方法
  • 缺点是不够透明,因叶子构件和容器构件具有不同的方法,且容器中那些用于管理成员对象的方法没有在抽象构件中定义,因此客户端不能完全针对抽象编程,必须有区别对待叶子构件和容器构件

5.7.5 优点

  • 可清楚定义分层次的复杂对象,表示对象的全部或部分层次,让客户段忽略了层次的差异,方便对整个层次结构进行控制
  • 可以一直地使用一个组合或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码
  • 模式中增加新的树枝节点和叶子节点均很方便,无需对现有类库进行任何修改,符合“开闭原则”
  • 为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子节点和树枝节点的递归组合,可以形成复杂的树形结构,但对树形结构的控制却很简单

5.7.6 使用场景

应用树形结构,如:文件目录显示,多级目录呈现等树形结构数据的操作

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

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

相关文章

基于asp.net+vbscript+wsc编写网站

1、前言 asp大家应该都比较熟悉&#xff0c;就是一个动态服务器页面&#xff0c;有点类似于jsp。只是不同的是asp可以在IIS服务器上创建&#xff0c;并且如果配置了.net环境的话&#xff0c;那么就可以在asp里面<%%>写vbscript。vbscript是一种脚本语言&#xff0c;其实就…

因果推断5--DML(个人笔记)

目录 1论文介绍 1.1论文 1.2摘要 1.3DML思路 2价格需求曲线 2.1价格需求弹性 2.2价格需求弹性计算DML代码 2.3价格需求弹性例子--数据集 2.4建模过程 2.5回归结果 1论文介绍 1.1论文 V. Chernozhukov, D. Chetverikov, M. Demirer, E. Duflo, C. Hansen, and a. W.…

(强制)类型转换方法

目录 一、C语言中的类型转换 二、C中的强制类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 2.5 总结 一、C语言中的类型转换 在C语言中&#xff0c;若赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或…

[PyTorch笔记]深度学习计算

[PyTorch笔记]深度学习计算1 层和块1.1自定义神经网络块1.2顺序块1.3在前向传播中执行代码2.参数管理2.1 访问参数、用于调试、诊断和可视化2.2 参数初始化2.2.1内置初始化&#xff1a;2.2.2 自定义初始化2.3 在不同模型组件间共享参数3.延后初始化4.自定义层4.1 不带参数的层4…

深入理解数据结构 —— 跳表

什么是跳表 只要是平衡搜索二叉树能实现的功能&#xff0c;跳表都能实现&#xff0c;且时间复杂度都相同 例如&#xff1a; 哈希表的功能&#xff1a;插入&#xff0c;查找&#xff0c;删除有序表的功能&#xff1a;查找大于某值最小的数&#xff0c;小于某值最大的数&#…

干货 | 数据跨境传输合规体系的构建思路

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;研究背景随着经济活动数字化转型加快&#xff0c;“数据”对生产、流通、分配和消费活动产生重要影响&#xff0c;成为新的生产要素。地区之间数据流通愈发频繁&#xff0c;…

图像频域滤波(理想低通滤波)

图像变换是对图像信息进行变换&#xff0c;是能量保持但重新分配&#xff0c;利于加工处理。这里主要介绍傅里叶变换的图像频域滤波。 图像从空间域变换到频域后&#xff0c;其低频分量对应图像中灰度值变化较为缓慢的区域&#xff0c;高频分量表征图像中物体的边缘和随机噪声等…

基于yolov5的钢材表面缺陷识别(pycharm连接远程服务器,老版本yolov5运行遇到的问题)

时间&#xff1a;2023年1月 1 pycharm远程连接服务器 提示&#xff1a;需要下载pycharm专业版。 参考文献&#xff1a; [1] [2] [3] [4] 设置解释器的界面有一些不同&#xff0c;在此截图记录一下。 &#xff08;这是已经弄好了之后回头截图的&#xff0c;假设它不存在哈) …

【寒假每日一题】洛谷 P6206 [USACO06OCT] Another Cow Number Game G

题目链接&#xff1a;P6206 [USACO06OCT] Another Cow Number Game G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 奶牛们在玩一种数字游戏&#xff0c;Bessie 想让你帮她预测一下结果。游戏开始时&#xff0c;Bessie 将得到一个正整数 N。此时她的分数为 0。 奶…

C 程序设计教程(07)—— 数据类型转换

C 程序设计教程&#xff08;07&#xff09;—— 数据类型转换 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;07&#xff…

mysql学习总结(一)

总结一下近期学习的mysql内容&#xff1a;这里主要总结一下mysql的底层数据结构索引的本质是什么&#xff1f;索引的本质就是排好序的一种数据结构&#xff0c;通过索引我们能干什么呢&#xff1f;&#xff0c;快速的去定位到我们想要查找的数据&#xff0c;就像是你看书&#…

Ansible 介绍与实战操作演示

文章目录一、概述二、Ansible 架构三、Ansible 工作原理四、Ansible 安装与基础配置1&#xff09;开启记录日志2&#xff09;去掉第一次连接ssh ask确认五、Ansible 的七个命令1&#xff09;ansible2&#xff09;ansible-doc3&#xff09;ansible-playbook4&#xff09;ansible…

非线性系统辨识:非线性 ARX 和 Hammerstein-Wiener

1. 系统辨识 系统辨识是根据系统的输入输出时间函数来确定描述系统行为的数学模型。现代控制理论中的一个分支。通过辨识建立数学模型的目的是估计表征系统行为的重要参数&#xff0c;建立一个能模仿真实系统行为的模型&#xff0c;用当前可测量的系统的输入和输出预测系统输出…

Js逆向教程25-BOM DOM过检测

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Js逆向教程25-BOM DOM过检测 一、JS BOM 检测 它是一种浏览器环境&#xff0c;脱离了浏览器在外部不能直接调用的就是BOM 在浏览器中…

SAP工作流对象类

目录 1. 实现IF_WORKFLOW接口 2. 创建流程属性 3. 接口方法参考 4. 定义事件 5. 工作流触发&#xff08;事件抛出&#xff09; 业务对象作为工作流的数据内核&#xff0c;也是联系业务流程和工作流的重要核心&#xff0c;体现形式一般为BOR或者业务对象类&#xff0c;用来标识不…

SpringCloud从入门到精通(六)

Hystrix-熔断器 Hystrix-概述 • Hystix 是Netflix 开源的一个延迟和容错库&#xff0c;用于隔离访问远程服务、第三方库&#xff0c;防止出现级联失败&#xff08;雪崩&#xff09;。• 雪崩&#xff1a;一个服务失败&#xff0c;导致整条链路的服务都失败的情形 Hystix 主要功…

【Neo4j构建知识图谱】:cypher操作语言加载 CSV电影人数据集链接文件

这目录 数据链接来源1、创建约束2、从 CSV 文件添加节点3、从 CSV 文件添加关系4、运行cypher查询5、清理数据库参考CSV 文件可以使用LOAD CSV密码条款。出于安全原因,无法加载本地CSV文件,这些文件必须在HTTP或HTTPS服务器(如GitHub,Google Drive和Dropbox)上公开访问。使…

Python 中将列表中的每个元素除以一个数字

Python 中将列表中的每个元素除以一个数字&#xff1a; 使用列表理解来遍历列表。在每次迭代中&#xff0c;将当前列表元素除以数字。新列表将包含除法结果。 my_list [8, 12, 20]# ✅ divide each element in list by number new_list [item / 2 for item in my_list] pri…

雪花算法笔记

SnowFlake 雪花算法 SnowFlake 中文意思为雪花&#xff0c;故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本。 实现原理 雪花算法原理就是生成一个的64位比特位的 long 类型的唯一 id。 最高1位固定值0&#xff0c;因…

React Context 完美替代品 Jotai

1. 前言 React 的属性透传场景 虽然有很多方式可以实现&#xff0c;但能做到代码写的少、re-render 轻松处理的方式并不多。 而状态管理工具 Jotai 却可以很好的解决这些问题。 最近的业务和组件场景里 也在用此方式实现。 2. React Context 的不足 常规解决数据透传通常使…