【Java设计模式】十一、组合模式

文章目录

  • 1、组合模式
  • 2、案例
  • 3、总结

1、组合模式

下面的文件系统,树形结构,有文件夹节点和文件节点(有无儿子节点的区别),使用这两种节点也要做区分。
在这里插入图片描述

组合模式(部分整体模式),就是把一组相似的对象当作一个单一的对象。依照树形结构组合对象,表示部分以及整体层次。包含的角色有:

  • 抽象根节点:定义系统各层次共有的方法和属性
  • 树枝节点:存储子节点
  • 叶子节点:其下再无分支,是遍历的最小单位

关键点:

  • 意图:将对象组合成树形结构,以表示部分-整体这个层次
  • 亮点:模糊简单元素和复杂元素的区别(文件和文件夹),以便可以统一使用结构中的所有对象
  • 实现方式:树枝和叶子实现抽象根节点,树枝内部聚合抽象根节点对象List<抽象根节点类>

2、案例

需求:对一个菜单,打印其及下面的儿子节点

在这里插入图片描述

类图:

在这里插入图片描述

菜单组件类,定义一些共有的属性和方法,属于抽象根节点。注意这个抽象类,添加、移除菜单等方法对于叶子节点来说是不支持的,因为它们没有,所以在 抽象类中直接throw new UnsupportedOperationException()做为默认的实现,以后留给子类去实现,或者子类不需要这个方法,那就可以直接不管,这一点在很多源码中都有用到。

//菜单组件  不管是菜单还是菜单项,都应该继承该类
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(int index){
        throw new UnsupportedOperationException();
    }

    //获取菜单名称
    public String getName(){
        return name;
    }

	//打印菜单名称
	//也可直接定义成抽象
	//public abstract void print();
    public void print(){
        throw new UnsupportedOperationException();
    }
}

定义菜单类,属于树枝节点,继承 + 聚合抽象根节点

public class Menu extends MenuComponent {
	
	//菜单可以有多个子菜单或者子菜单项(叶子)
    private List<MenuComponent> menuComponentList;

    public Menu(String name,int level){
        this.level = level;
        this.name = name;
        menuComponentList = new ArrayList<MenuComponent>();  //构造方法中初始化
    }

    @Override
    public void add(MenuComponent menuComponent) {
        menuComponentList.add(menuComponent);  //List中加一个
    }

    @Override
    public void remove(MenuComponent menuComponent) {
        menuComponentList.remove(menuComponent);   //List中删一个
    }

    @Override
    public MenuComponent getChild(int index) {
        return menuComponentList.get(index);
    }

    @Override
    public void print() {
    	//不同的层级,前面打印不同长度的横线,以作控制台打印缩进区分
    	for (int i = 1; i < level; i++) {
            System.out.print("--");
        }
        //打印菜单名称
        System.out.println(name);
        //打印子菜单或子菜单项名称
        for (MenuComponent menuComponent : menuComponentList) {
            menuComponent.print();
        }
    }
}

定义菜单项类(没有儿子的叶子节点),add、remove等方法不再重写,采用父类的默认实现抛出一个UnsupportedOperationException即可

public class MenuItem extends MenuComponent {

    public MenuItem(String name,int level) {
        this.name = name;
        this.level = level;
    }

    @Override
    public void print() {
    	//不同的层级,前面打印不同长度的横线,以作控制台打印缩进区分
        for (int i = 1; i < level; i++) {
            System.out.print("--");
        }
        System.out.println(name);
    }
}

测试:

public class Client {
    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));
        menu1.add(new MenuItem("新增菜单", 3));
        MenuComponent menu2 = new Menu("权限管理", 2);
        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();
    }
}

运行:

在这里插入图片描述

3、总结

组合模式为树形结构而生,可以方便的增加树枝节点和叶子节点,而无须对现有代码做任何修改

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端运算符比较与计算中的类型转换,运算规则

题目&#xff1a; 下面表达式的值分别都是什么&#xff08;类型转换&#xff09; 0 0 0 2 true 2 false false false false 0 false undefined false null null undefined\t\r\n 0JS中的原始类型有哪些 原始值类型就是 存储的都是值&#xff0c;没有函数可以调用的。…

解决ts报错:类型“entry”上不存在属性“$AppTools”

uniapp ts 项目&#xff0c;已经将AppTools挂在了vue的原型上&#xff0c;但是在vue页面使用时报错&#xff0c;如图&#xff1a; 解决&#xff1a; 在项目根目录下的tsconfig.json文件添加如下配置&#xff1a; "include": ["src/**/*"],这样报错就消失…

32单片机基础:输入捕获测频率

接线图如下图所示&#xff1a; 我们复制之前写过的代码6-3 PWM驱动LED呼吸灯 在PWM模块中&#xff0c;执行的逻辑是&#xff0c;初始化TIM2的通道1&#xff0c;产生一个PWM波形&#xff0c;输出引脚是PA0&#xff0c;通过SetCompare1的函数&#xff0c;可以调节CCR1寄存器的值…

算法相关计算

1 内存管理相关 1 .1 float 6.9 f 的内存计算方法 二进制小数的计算&#xff1a; &#xff08;1&#xff09;小数的二进制算法和整数的大致相反&#xff0c;就是不断的拿小数部分乘以2取积的整数部分&#xff0c;然后正序排列。比如求0.9的二进制&#xff1a; 0.9*21.8 取 1…

【网络】主机连接 TCP 三次握手

【网络】主机连接 TCP 三次握手 一、TCP连接3次握手二、TCP连接4次挥手三、为什么tcp要三次握手&#xff0c;两次行不四、为什么TCP挥手需要4次五、Netstat命令的连接状态包括:六、练习题 一、TCP连接3次握手 1、建立连接的时候是3次握手&#xff0c;客户端向服务器端发送SYN&…

微软亚太区AI智能应用创新业务负责人许豪,将出席“ISIG-AIGC技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;AIGC开放社区、RPA中国、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索A…

手写分布式配置中心(四)增加实时刷新功能(长轮询)

上一篇文章中实现了短轮询&#xff0c;不过短轮询的弊端也很明显&#xff0c;如果请求的频率较高&#xff0c;那么就会导致服务端压力大&#xff08;并发高&#xff09;&#xff1b;如果请求的频率放低&#xff0c;那么客户端感知变更的及时性就会降低。所以我们来看另一种轮询…

(上海电力展)2024上海国际智慧电力与电气设备展览会

2024上海国际智慧电力与电气设备展览会 2024 Shanghai International Intelligent Power and Electrical Equipment Exhibition 时 间&#xff1a;2024年7月13-15日 地 点&#xff1a;上海新国际博览中心 展会简介Introduction 随着全球进入互联网和数字经济时…

精品中国货出海wordpress外贸独立站建站模板

旗袍唐装wordpress外贸网站模板 旗袍、唐装、华服wordpress外贸网站模板&#xff0c;适合做衣服生意的外贸公司官网使用。 https://www.jianzhanpress.com/?p3695 劳动防护wordpress外贸独立站模板 劳动防护wordpress外贸独立站模板&#xff0c;劳动保护、劳动防护用品外贸…

“首件检验”为什么至关重要?(内附流程规范)

在产品的设计及生产过程中&#xff0c;经常会出现设计变更、工艺变更、制程调整、非计划停线及转产、转线等“变化”。 如何确保这些“变化”不影响产品后续的生产品质&#xff1f;这就需要在作业准备验证、停产后验证阶段&#xff0c;进行不能缺少的重要环节——“首件检验”。…

VGW在 Windows 平台上局域网就绪的旁路由器程序

在查阅本篇文章之前可以查看下&#xff0c;本人前两年写的关于VGW软件路由器的文章 Linux 平台上面单网卡 TUN/TAP实现局域网其它设备上网_linux 物理网卡与tun同网段-CSDN博客 VGW软件路由器是一个工作IEEE以太网&#xff08;L2&#xff09;链路层的路由器程序&#xff0c;它…

第三讲 汇编初步 课程随手记

一、寄存器 32位CPU通用寄存器如下图所示&#xff1a; 因为教材依照的是32位CPU寄存器&#xff0c;而我安装的是64位寄存器&#xff0c;所以找了一下64位的寄存器的资料 PS&#xff1a;一般来说&#xff0c;Intel处理器字节存储顺序为小端法存储&#xff0c;是指数据的高字节保…

el-table 表格多选, 批量删除功能

一、基础的多选el-table ElementUI 提供了多选行table&#xff0c;同时若依框架也提供了成熟的多选表格。 1.table基础结构 需要绑定selection-change方法 <el-tablev-loading"loading"stripe:data"productList"selection-change"handleSelect…

常见的几种echarts类型

一&#xff1a;折线图 let option {tooltip: {},animation: false,grid: {top: "20%",bottom: "33%", //也可设置left和right设置距离来控制图表的大小left: 5%,right: 5%},xAxis: {boundaryGap:false,data: [1,2,3,4,5],axisLine: {show: true, //隐藏X轴…

【常见索引使用】⭐️Mysql中索引的类型以及使用方式和失效场景

目录 一、前言 二、数据准备 三、索引的分类 四、索引示例 示例1、主键索引&#xff08;Primary Key Index&#xff09;与 唯一索引&#xff08;Unique Index&#xff09; 示例2、前缀索引&#xff08;Prefix Index&#xff09; 示例3、联合索引&#xff08;复合索引&am…

智能驾驶规划控制理论学习07-规划算法整体框架

一、解耦合策略 1、路径-速度解耦策略概述 路径-速度解耦指的是将车辆的运动分成路径规划和速度规划两部分&#xff0c;对两个部分分别进行研究。 路径规划&#xff1a; 假设环境是“静态的”&#xff0c;将障碍物投射到参考路径上&#xff0c;并规划一条避开它们的路径&…

2024年【安全员-C证】找解析及安全员-C证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证找解析是安全生产模拟考试一点通总题库中生成的一套安全员-C证模拟考试&#xff0c;安全生产模拟考试一点通上安全员-C证作业手机同步练习。2024年【安全员-C证】找解析及安全员-C证模拟考试 1、【多选题】…

第十二篇 - IAB 标准技术条款和定义-我为什么要翻译介绍美国人工智能科技巨头IAB公司?

前言 这是2021年IAB公司发布的《市场营销人工智能使用案例及最佳实践报告》的最后一篇译文。翻译工作不难&#xff0c;但是非常考验一个人的态度&#xff0c;需要译者忠于自己的初心&#xff0c;严谨对待所有文字、数据、信息、技术和观点。时代变化如此之快&#xff0c;3年前…

【小黑嵌入式系统第十八课】结课总结(二)——软件部分(系统架构调试测试运行系统软件设计)

上一课&#xff1a; 【小黑嵌入式系统第十七课】结课总结&#xff08;一&#xff09;——硬件部分&#xff08;系统&总线&处理器&外设&通信&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分…

js节点操作

js节点操作 一.DOM节点二.查找节点三.增加节点3.1.创建节点3.2.追加节点3.3.克隆节点 四. 删除节点 一.DOM节点 DOM树里每一个内容都称之为节点 节点类型&#xff1a;元素节点&#xff08;所有的标签 比如 body&#xff0c;div等&#xff0c;html 是根节点&#xff09; 属性节…
最新文章