GPT带我学-设计模式11-组合模式

设计模式类型

结构型设计模式

使用场景

将对象组合成树状结构来表现"部分-整体"的层次结构。这种模式能够使得客户端对单个对象和组合对象的使用具有一致性。这句话太抽象了,拿一个实际的网站菜单树例子来说。

例子:网页菜单树

一个网站的导航菜单。这个导航菜单包含一级菜单和二级菜单,二级菜单可以是链接或者进一步的子菜单。让我们来用组合模式来设计这个网页菜单树。
首先,我们需要一个共同的抽象类或接口来表示菜单项,让我们称之为 MenuItem:

public interface MenuItem {void display();
}

然后,我们创建菜单项类,它们都实现了 MenuItem 接口。对于一级菜单和二级菜单,我们创建不同的实现类:

import java.util.ArrayList;
import java.util.List;public class Menu implements MenuItem {private String name;private List<MenuItem> items;public Menu(String name) {this.name = name;this.items = new ArrayList<>();}public void addMenuItem(MenuItem item) {items.add(item);}public void removeMenuItem(MenuItem item) {items.remove(item);}public void display() {System.out.println("Menu: " + name);for (MenuItem item : items) {item.display();}}
}public class MenuItemLink implements MenuItem {private String name;private String url;public MenuItemLink(String name, String url) {this.name = name;this.url = url;}public void display() {System.out.println("Link: " + name + ", URL: " + url);}
}

现在,我们可以创建网页菜单树,并使用组合模式将菜单项组织起来:

public class Main {public static void main(String[] args) {MenuItemLink homeLink = new MenuItemLink("Home", "/home");MenuItemLink aboutLink = new MenuItemLink("About", "/about");Menu mainMenu = new Menu("Main");mainMenu.addMenuItem(homeLink);mainMenu.addMenuItem(aboutLink);MenuItemLink productsLink = new MenuItemLink("Products", "/products");MenuItemLink servicesLink = new MenuItemLink("Services", "/services");Menu subMenu = new Menu("Sub");subMenu.addMenuItem(productsLink);subMenu.addMenuItem(servicesLink);mainMenu.addMenuItem(subMenu);mainMenu.display();}
}

控制台输出:

Menu: Main
Link: Home, URL: /home
Link: About, URL: /about
Menu: Sub
Link: Products, URL: /products
Link: Services, URL: /services

这段代码创建了一个简单的网页导航菜单树,其中包含一级菜单和二级菜单。我们使用了组合模式,使得对于一级菜单和二级菜单的处理方式是一致的。通过递归调用 display() 方法,我们可以将整个菜单树打印出来。

这就是用网页菜单树来说明组合模式的基本思想。通过将菜单项组合成树状结构,我们可以轻松地处理复杂的菜单关系,并且对于客户端来说,可以用统一的方式处理单个菜单项和菜单组合

组合模式使用场景

组合模式在许多场景中都是非常有用的,特别是当你需要处理对象的层次结构,且希望对单个对象和组合对象进行一致性处理时。以下是一些常见的场景:

GUI组件:图形用户界面(GUI)通常具有嵌套的层次结构,例如窗口包含面板,面板包含按钮等。组合模式可以用来构建和管理GUI组件的层次结构,使得对于单个组件和组合组件的处理方式一致。

文件系统:文件系统具有树状结构,文件夹可以包含文件和其他文件夹。组合模式可以用来表示文件系统的层次结构,并且可以统一处理文件和文件夹。

组织结构:企业组织结构也通常具有层次关系,例如部门包含子部门,子部门中可能包含员工或其他子部门。组合模式可以用来管理和操作组织结构。

菜单和导航:像前面示例中的网页导航菜单一样,菜单和导航通常具有嵌套的层次结构。组合模式可以用来构建和管理菜单和导航的层次结构。

图形对象:图形对象也可以使用组合模式来表示,例如组合图形可以由多个基本图形对象(如线段、矩形、圆形)组成,从而可以对整个图形进行统一的操作。

总之,任何具有层次结构的对象集合,且希望对单个对象和组合对象进行一致性处理的情况下,都可以考虑使用组合模式。

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

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

相关文章

C++经典面试题目(十八)

1、请解释虚函数表的概念&#xff0c;并说明其在多态中的应用。 虚函数表&#xff08;Vtable&#xff09;是用于实现多态的一种机制&#xff0c;它是一个存储虚函数地址的表。每个含有虚函数的类都会有一个对应的虚函数表&#xff0c;其中存放着该类的虚函数的地址。当对象被创…

【CSS】伪元素

伪元素 常见的伪元素 ::first-line::first-letter::before 在元素第一个子元素前增加内容::after 在元素最后一个子元素后增加内容 为了区分伪类和伪元素&#xff0c;建议伪元素都使用2个冒号::first-line可以针对首行文本设置属性::first-letter可以针首字母设置属性::before…

【技巧】如何解除Excel“打开密码”?

给Excel表格设置“打开密码”&#xff0c;可以保护表格不被他人随意打开&#xff0c;那如果后续不需要保护了&#xff0c;不想每次打开Excel都需要输密码&#xff0c;要怎么去除“打开密码”呢&#xff1f; 今天分享3个方法&#xff0c;最后一个方法记得收藏起来&#xff0c;以…

基于51单片机的智能报警系统Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/10dhkyV5O629UpFHHV67LpQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectroni…

源码|并发一枝花之CopyOnWriteArrayList

CopyOnWriteArrayList的设计思想非常简单&#xff0c;但在设计层面有一些小问题需要注意。 JDK版本&#xff1a;oracle java 1.8.0_102 本来不想写的&#xff0c;但是github上CopyOnWriteArrayList的code results也有165k&#xff0c;为了流量还是写一写吧。 实现 看两个方法你…

LVS、HAProxy

集群&#xff1a;将很多个机器组织到一起&#xff0c;作为一个整体对外提供服务。集群在扩展性、性能方面都可以做到很灵活。集群的分类&#xff1a;负载均衡集群&#xff1a;Load Balance。高可用集群&#xff1a;High Available。高性能集群&#xff1a;High Performance Com…

Python学习从0到1 day20 第二阶段 面向对象 ② 封装

缘分 朝生暮死犹如露水 —— 24.4.1 学习目标&#xff1a; 1.理解封装的概念 2.掌握私有成员的使用 一、面向对象三大特性&#xff1a; 面向对象编程&#xff0c;是许多编程语言都支持的一种编程思想 简单理解是&#xff1a;基于模板&#xff08;类&#xff09;去创建实体&…

请解释一下Velocity模板引擎的基本工作原理是什么?在Velocity中,如何定义和使用变量?

请解释一下Velocity模板引擎的基本工作原理是什么&#xff1f; Velocity模板引擎的基本工作原理可以概括为将数据模型与模板文件相结合&#xff0c;通过解析模板中的指令和占位符&#xff0c;将数据模型的内容填充到模板中&#xff0c;最终生成所需的文本输出。 具体来说&…

一个基于大数据的派单管理系统

通常需要处理大量的订单数据&#xff0c;并确保这些数据能够在各个相关部门之间高效、准确地传递。这样的系统不仅有助于提高派单效率&#xff0c;还能优化资源配置&#xff0c;减少不必要的浪费。以下是一个包含所需元素的系统设计方案概述&#xff1a; 数据结构 订单号&…

枚举---算法

1、定义 枚举算法&#xff1a;也称之为穷举算法&#xff0c;这种算法就是在解决问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能&#xff0c;最后推导出结果。优点&#xff1a;简单粗暴&#xff0c;它暴力的枚举所有可能&#xff…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化&#xff1a; 2.数据库设计与规划 1.提前估计数据量&#xff0c;使用什么存储引擎 2.数据库服务器专机专用&#xff0c;避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器&#xff0c;以达到稳定、高效的效果。主从同步、…

Flask Response生成流式数据api;iter_lines,iter_content遍历区别

1、Flask Response生成流式数据api 注意return与def generate():是同级的 from flask import Flask, Responseapp Flask(__name__)app.route(/stream) def stream_data():def generate():for i in range(5):time.sleep(1)yield f"Data chunk {i}\0" # 在每个数据…

风控系统:通过净值及盈亏开启和关闭自动交易

一、风控对交易员的好处 帮助交易员执行交易纪律并保护他们的交易资金。 纪律风控&#xff1a;对不符合交易纪律的交易执行风控&#xff0c;对交易纪律性差的交易员执行约束操作。净值风控&#xff1a;对满足条件的净值执行风控&#xff0c;防止交易员的账户净值过度下降。手数…

Mysql的库函数

MySQL是一个流行的开源关系型数据库管理系统&#xff0c;它提供了大量的内置库函数&#xff0c;用于在查询时执行各种操作。这些函数可以帮助开发者在数据检索、转换和处理过程中实现更复杂的逻辑。 1 字符串函数 函数描述ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。CHA…

Memory Analyzer Tool使用教程

下载地址&#xff1a;https://eclipse.dev/mat/previousReleases.php 下载JDK8对应的MAT版本 使用jps查看pid jps 使用jmap生成heap dump文件 jmap -dump:formatb,live,filexxx.bin <pid> 使用MAT打开heap dump文件 查看GC Roots

【Linux入门】Linux简史

Linux 是什么&#xff1f;Linux 是一款叫做操作系统的软件。 操作系统这款软件有什么样的意义呢&#xff1f;简单来说&#xff0c;比如有顾客买了一台笔记本电脑&#xff0c;这台笔记本电脑由电脑硬件组成&#xff0c;在这堆硬件上一定搭载了一款操作系统。正因为操作系统存在&…

ssm013小型企业办公自动化系统的设计和开发+vue

小型企业办公自动化系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱&am…

git删除某次commit的代码

这里写目录标题 1.问题背景2.问题拆解尝试&#xff1a;a.使用git reset --hard HEAD &#xff08;不行&#xff0c;局限性太大&#xff09;尝试&#xff1a;b.使用git rebase -i HEAD &#xff08;可以&#xff0c;但push -f不太友好&#xff09;尝试&#xff1a;c.使用git rev…

C语言中,`while` 和 `for` 的区别

在C语言中&#xff0c;while 和 for 是两种循环结构&#xff0c;它们的作用是执行一段代码多次&#xff0c;直到满足某个条件为止。虽然它们可以互相替代&#xff0c;但通常根据具体的情况选择使用其中之一。 **区别&#xff1a;** 1. **语法结构&#xff1a;** - while 循…

ETL工具-nifi干货系列 第六讲 处理器JoltTransformJSON

1、处理器作用 使用Jolt转换JSON数据为其他结构的JSON,成功的路由到success,失败的failure。处理JSON的实用程序不是基于流的&#xff0c;因此大型JSON文档转换可能会消耗大量内存。 Jolt&#xff1a;JSON 到 JSON 转换库&#xff0c;用 Java 编写&#xff0c;其中转换的 &qu…