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

2024-04-10 02:28

本文主要是介绍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等控件,就变成很自然的事情,这就是典型的组合模式的应用。

这篇关于Java设计模式—组合模式(Composite Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889845

相关文章

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.