Java设计模式—组合模式(Composite Pattern)

        组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

public class CompositeTest {
    public static void main(String[] args){
        // 创建主菜单
        MenuComponent mainMenu = new Menu("Insert");
        // 创建子菜单
        MenuComponent subMenu = new Menu("Chart");
        // 创建菜单项
        MenuComponent element = new MenuItem("On This Sheet");
        
        // 将子菜单添加到主菜单中
        mainMenu.addMenuElement(subMenu);
        // 将菜单项添加到子菜单中
        subMenu.addMenuElement(element);
        
        // 打印菜单结构
        printMenus(mainMenu);
    }
    
    private static void printMenus(MenuComponent ifile){
        // 打印当前菜单的名称
        ifile.printName();
        // 获取当前菜单的子元素列表
        List<MenuComponent> children = ifile.getElement();

        // 如果子元素列表为空,则直接返回
        if(children == null) return;
        
        // 遍历子元素列表,递归打印每个子元素的名称
        for(MenuComponent element : children){
            printMenus(element);
        }
    }
}
public class Menu extends MenuComponent{
    private List<MenuComponent> elementList;

    public Menu(String name){
        this.name = name;
        this.elementList = new ArrayList<>();
    }

    public boolean addMenuElement(MenuComponent element){
        return elementList.add(element);
    }

    public boolean removeMenuElement(MenuComponent element){
        return elementList.remove(element);
    }

    public List<MenuComponent> getElement(){
        return elementList;
    }
}
public class MenuItem extends MenuComponent{
    public MenuItem(String name){
        this.name = name;
    }

    public boolean addMenuElement(MenuComponent element){
        return false;
    }

    public boolean removeMenuElement(MenuComponent element){
        return false;
    }

    public List<MenuComponent> getElement(){
        return null;
    }
}
public abstract class MenuComponent {
    protected String name;

    public void printName(){
        System.out.println(name);
    }

    public abstract boolean addMenuElement(MenuComponent element);

    public abstract List<MenuComponent> getElement();
}

MenuComponent 抽象类:定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。

Menu 类:表示菜单,可以包含其他菜单或菜单项。

MenuItem 类:表示菜单中的一个具体项。

CompositeTest 类:包含了 main 方法,用于测试组合模式的实现。

CompositeTest 类中,main 方法创建了一个主菜单、一个子菜单以及一个菜单项,并将它们按照一定的结构添加到了一起。然后调用 printMenus 方法打印整个菜单的结构。

Menu 类表示菜单,它继承自 MenuComponent 抽象类,并实现了该抽象类中的抽象方法。Menu 类中包含一个 elementList 成员变量,用于存储菜单中的子元素(即菜单或菜单项)。它提供了添加和移除子元素的方法,并实现了抽象方法 getElement 来获取子元素列表。

MenuComponent 抽象类定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。它有一个 name 成员变量表示菜单组件的名称,并定义了一个抽象方法 addMenuElement 用于添加子元素,以及一个抽象方法 getElement 用于获取子元素列表。

MenuItem 类表示菜单中的一个具体项,它继承自 MenuComponent 抽象类,并实现了该抽象类中的抽象方法。由于菜单项不包含其他子元素,因此 addMenuElementremoveMenuElementgetElement 方法的实现都返回了相应的默认值。

何时使用组合模式

        当你发现需求中是体现部分与整体层次的结构时 ,以及你 希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时, 就应该考虑用组合模式了。" Java开发窗体用的容器控件java.awt.Container,它继承于java.awt.Component,就有add方法和remove方法,所以在它上面增加控件,比如Button、Label、Checkbox等控件,就变成很自然的事情,这就是典型的组合模式的应用。

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

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

相关文章

【Unity添加远程桌面】使用Unity账号远程控制N台电脑

设置地址&#xff1a; URDP终极远程桌面&#xff1b;功能强大&#xff0c;足以让开发人员、设计师、建筑师、工程师等等随时随地完成工作或协助别人https://cloud-desktop.u3dcloud.cn/在网站登录自己的Unity 账号上去 下载安装被控端安装 保持登录 3.代码添加当前主机 "…

【环境搭建】ubuntu工作站搭建全流程(显卡4090)

安装ubuntu22.04系统 首先&#xff0c;先压缩windows分区&#xff0c;按住Win X快捷键&#xff0c;选择磁盘管理,压缩分区&#xff0c;压缩出新的分区用于安装ubuntu22.04 windows插入系统盘&#xff0c;点击重启&#xff0c;一直按F12,选择系统盘启动方式语言选择chinese–…

超详细的YOLOv8项目组成解析:一站式指南了解其架构与组件

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 项目结构 1. .github 2. docker 2.1 docker/Dockerfile 2.2 docker/Dockerfile-arm64 2.3 docker/Dockerfile-conda 2.4 docker/Dockerfile-cpu 2.5 docker/Dockerfile-jetson 2.6 docker/D…

虚拟机网络配置

1. 为什么要配置&#xff1f; 当我们创建好一个虚拟机并在网络方面未作更改由虚拟机自动生成ip地址时&#xff0c;虚拟机的ip地址是处于动态变化的&#xff0c;每次开启都会再随机生成一个新的ip&#xff1b;这不利于我们通过其他设备远程连接该虚拟机&#xff0c;这时候需要我…

SpringBoot学习之Kibana下载安装和启动(Mac版)(三十二)

一、简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。 …

JVM_垃圾收集器

GC垃圾收集器 文章目录 GC垃圾收集器GC垃圾回收算法和垃圾收集器关系GC算法主要有以下几种四种主要的垃圾收集器SerialParallelCMSG1垃圾收集器总结查看默认垃圾收集器 默认垃圾收集器有哪些各垃圾收集器的使用范围部分参数说明 新生代下的垃圾收集器并行GC(ParNew)并行回收GC&…

Java-StringBuilder容器

一、基础用法 1.创建对象 StringBuilder sbnew StringBuilder(); 2.添加元素 可以添加整型、浮点型、字符串等。 sb.append(1); sb.append(2.3); sb.append(true); 3.反转 sb.reverse(); 4.获取长度 int len sb.length(); 5.转变成字符串 tring strsb.toString(); …

MySQL高级(索引语法、创建索引、查看索引、删除索引)

创建索引 create [unique | fulltext] index index_name on table_name (index_col_name,...); 查看索引 show index from table_name; 删除索引 drop index index_name on table_name; 案例演示&#xff1a; 先来创建一张表 tb_user&#xff0c;并且查询测试数据。 cre…

Win10系统下的EDGE浏览器启用IE模式

Win10系统下的EDGE浏览器目前已弃用IE内核&#xff0c;这样在访问某些较老的网站会有兼容性问题&#xff0c;本文记录了在EDGE浏览器中启用IE模式的操作方法。 一、启用EDGE浏览器的IE模式 要打开Internet Explorer模式&#xff0c;执行以下步骤: 1、在Microsoft Edge的地址栏…

JAVA集合(容器)

JAVA集合&#xff08;容器&#xff09;概念&#xff1a; 当我们需要存储一组一样&#xff08;数据类型相同&#xff09;的数据时需要用容器进行存储&#xff0c;数组就是这样一种容器&#xff0c;但是数组长度一经定义就不能再改变。 在实际开发中我们需要用到可以动态增长的…

【操作系统】CentOS7入门级安装

下载镜像 CentOS镜像下载Download (centos.org) 我们选择第一个 X86_64 CentOS Mirrors List 版本描述X86_X64带64位的32位扩展版(一般安装这个)ARM64 (aarch64)嵌入式。适用于微端(树莓派、机械臂、机械中控)IBM Power (ppc64le)专用于IBM POWER服务器 选择一个合适的链接 …

2024年32款数据分析工具分五大类总览

数据分析工具在现代商业和科学中扮演着不可或缺的角色&#xff0c;为组织和个人提供了深入洞察和明智决策的能力。这些工具不仅能够处理大规模的数据集&#xff0c;还能通过强大的分析和可视化功能揭示隐藏在数据背后的模式和趋势。数据分析工具软件主要可以划分为以下五个类别…

虚拟机VMware的下载、注册码(Mac与Windows)

1. 虚拟机的下载 windows 版的虚拟机叫 VMware Workstation mac版的虚拟机叫 VMware Fusion 官网下载地址: window 下载地址 https://www.vmware.com/content/vmware/vmware-published-sites/us/products/workstation-pro.html mac 下载地址 https://www.vmware.com/prod…

纯小白蓝桥杯备赛笔记--DAY10(字符串)

文章目录 KMP字符串哈希算法简介&#xff1a;斤斤计较的小z--2047字符串hash Manacher回文串的性质算法简介最长回文子串 字典树基础朴素字符串查找步骤前缀判定--1204 01tire算法简介&#xff1a;例题1&#xff1a;例题2&#xff1a; KMP字符串哈希 算法简介&#xff1a; 真前…

Supervision:机器视觉的技术平权

Roboflow Supervision是面向非机器视觉专家的可重复使用的计算机视觉工具。 无论你是需要从硬盘加载数据集、在图像或视频上绘制检测&#xff0c;或者计算一个区域中有多少检测目标&#xff0c;都可以依靠Supervison&#xff01; NSDT工具推荐&#xff1a; Three.js AI纹理开发…

Lambda 表达式简单演化(原始的方法调用,一步步简化成 lambda 表达式的过程)

目录 Lambda 表达式简单演化原始的方法调用&#xff0c;一步步简化成 lambda 表达式的过程原始接口方法没有参数的演示—示例 1具体代码 原始接口方法携带参数的演示—示例 2具体方法 Lambda 表达式简单演化 函数式接口的定义&#xff1a; 1、任何接口&#xff0c;如果只包含唯…

Springboot 测试模块 + 注入bean失败

1.添加依赖 <dependencies><!-- ... 其他依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> </depende…

Chatgpt掘金之旅—有爱AI商业实战篇|在线辅导业务|(十一)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在线辅导业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着…

【LeetCode】修炼之路-0002-Add Two Numbers(两数相加)【python】【中等】

题目 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list. You may assume the two…

使用MobaXterm/winTerm之类的工具连接虚拟机时报错Permission denied或者Access denied的解决办法

一、虚拟机设置&#xff1a; 1.将点击【编辑】---> 【虚拟网络编辑器】 2.添加VMnet6 1&#xff09;点击【DHCP设置】--->添加网络--->选中【仅主机模式】【将主机虚拟适配器连接到此网络】 2&#xff09;子网ip写“192.168.66.0” 3&#xff09;点击右下角【应用…