设计模式使用场景实现示例及优缺点(结构型模式——组合模式)

结构型模式

组合模式(Composite Pattern)

组合模式使得用户对单个对象和组合对象的使用具有一致性。
有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。

适用场景

  1. 管理层次结构

    • 当你需要表示对象的部分-整体层次结构时,可以使用组合模式。
  2. 统一单个对象和组合对象的处理方式

    • 当你希望客户端无需区分单个对象和组合对象即可操作它们时。
  3. 简化代码结构

    • 通过将统一的操作应用于组合结构的所有元素,可以简化客户端代码。

组合模式的核心组件

组件(Component)

所有参与组合模式的对象都需要实现一个‘组件’接口。这个接口规定了一系列的操作,如添加、删除、以及获取子元素等,确保所有的对象都可以被一致对待。

叶节点(Leaf)

在组合模式中,叶节点代表没有子节点的对象。它是组合结构的基本元素,不能再被分解。

复合节点(Composite)

与叶节点相对应,复合节点是那些含有子节点的对象。它实现了组件接口中与子节点操作相关的方法,如增加或删除子节点。

实现示例(Java)

以下是一个简单的组合模式的实现示例,展示如何将对象组织成树形结构,并统一处理。

1. 定义组件接口
public interface Component {void operation();void add(Component component);void remove(Component component);Component getChild(int i);
}
2. 定义叶节点类
public class Leaf implements Component {private String name;public Leaf(String name) {this.name = name;}public void operation() {System.out.println("Leaf " + name + ": operation");}public void add(Component component) {throw new UnsupportedOperationException();}public void remove(Component component) {throw new UnsupportedOperationException();}public Component getChild(int i) {throw new UnsupportedOperationException();}
}
3. 定义组合类
import java.util.ArrayList;
import java.util.List;public class Composite implements Component {private List<Component> children = new ArrayList<>();private String name;public Composite(String name) {this.name = name;}public void operation() {System.out.println("Composite " + name + ": operation");for (Component component : children) {component.operation();}}public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}public Component getChild(int i) {return children.get(i);}
}
4. 客户端代码
public class Client {public static void main(String[] args) {Composite root = new Composite("root");Composite branch1 = new Composite("branch1");Composite branch2 = new Composite("branch2");Leaf leaf1 = new Leaf("leaf1");Leaf leaf2 = new Leaf("leaf2");root.add(branch1);root.add(branch2);branch1.add(leaf1);branch2.add(leaf2);root.operation();}
}

优点

  1. 简化客户端代码

    • 客户端可以统一对待单个对象和组合对象。
  2. 增加新类型的组件容易

    • 在不修改现有代码的情况下,可以很容易地添加新类型的组件。
  3. 形成树形结构

    • 明确地定义了复杂对象的组成部分和子部件的层次关系。

缺点

  1. 设计复杂

    • 设计组合结构时,需要仔细考虑整体与部分的关系,可能会导致设计上的复杂性。
  2. 过度泛化

    • 组件接口的设计可能过于泛化,导致一些组件实现了它们不需要的操作。

类图

Client|v
Component <---- Composite|vLeaf

总结

组合模式提供了一种灵活的结构,用于表示具有层次结构的对象。它使得客户端可以统一地处理单个对象和组合对象,简化了客户端代码的复杂性。这种模式特别适合那些需要处理对象集合的场景,例如图形用户界面组件、文件系统等。

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

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

相关文章

小米起诉“小米”商标侵权,索赔500万!

近日浙江丽水有家叫小米的公司&#xff0c;因为商标侵权被小米科技起诉索赔500万&#xff0c;需要变更企业名称&#xff0c;官网也不能用“小米智能大家居”等&#xff0c;还有其它的赔偿&#xff0c;普推知产商标老杨分析&#xff0c;“小米智能大家居”“小米”&#xff0c;后…

【Flask从入门到精通:第九课:数据库基本操作、数据表操作以及数据操作】

数据库操作 数据库驱动&#xff08;drivers&#xff09;模块&#xff1a;pymysql、MySQLDB 数据库基本操作 在SQLAlchemy中&#xff0c;添加、修改、删除操作&#xff0c;均由数据库会话(sessionSM)管理。 会话用 db.session 表示。在准备把数据写入数据库前&#xff0c;要先…

交易平台Zero Hash现已支持SUI交易

Zero Hash是一家领先的加密货币和稳定币基础设施平台&#xff0c;为包括Stripe、Shift4和Franklin Templeton在内的公司提供支持&#xff0c;现在也支持对SUI的访问。此举使Zero Hash的客户及其终端用户能够使用SUI。 提供API和SDK以及专注于无缝连接法币、加密货币和稳定币的…

读人工智能全传11人工智能会出什么错

1. 人工智能会出什么错 1.1. 一些报道是公正合理的&#xff0c;不过坦白地说&#xff0c;大部分报道都愚蠢得无可救药 1.2. 一些报道颇有知识性和引导性&#xff0c;而大部分则是杞人忧天式的恐吓 1.3. 滑稽的报道迎合了大众对人工智能的“终结者式恐惧” 1.3.1. 我们创造出…

html设计(两种常见的充电效果)

第一种 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

方便快捷传文件—搭建rsync文件传输服务器

比如我们有一个服务器&#xff0c;想把各个机器的文件都通过脚本传给这台机&#xff0c;用sftp或者直接rsync就必须输密码&#xff0c;肯定不行&#xff0c;做等效性免密又麻烦&#xff0c;怎么办呢&#xff0c;这么办&#xff01; 在服务端 yum -y install rsync #编辑&…

Vue3 关于scss预编译中:deep 其中的deep如何理解

在SCSS预处理器中&#xff0c;:deep是一个伪类选择器&#xff0c;用于选择一个元素的所有后代元素&#xff0c;无论它们在DOM结构中的层级深度如何。换句话说&#xff0c;:deep选择器是一个类似于CSS中的后代选择器&#xff0c;但是它可以不考虑嵌套层级的限制&#xff0c;而是…

Android MessageQueue 源码分析

类注释 /*** Low-level class holding the list of messages to be dispatched by a* {link Looper}. Messages are not added directly to a MessageQueue,* but rather through {link Handler} objects associated with the Looper.** <p>You can retrieve the Messa…

【FineGrip】全光学感知:一种新的通用遥感图像解释任务和细粒度数据集(IEEE TGRS 2024)

摘要 目前的遥感解译模型通常集中于单一的任务&#xff0c;如检测、分割或字幕。但是&#xff0c;针对特定任务设计的模型无法实现综合多层次解译。该领域也缺乏多任务联合解译数据集。本文提出Panoptic Perception&#xff0c;一个新的任务和一个新的细粒度数据集&#xff08…

apache Kylin系列介绍及配置

Apache Kylin是一个开源的分布式分析引擎,用于OLAP(联机分析处理)数据处理。它专门设计用于处理大规模的数据集,并提供快速的查询和分析能力。 apache Kylin架构: Apache Kylin是一个开源的分布式分析引擎,旨在提供高性能、低延迟的OLAP(联机分析处理)能力。下面是Ap…

nvim工具介绍

1. **seoul256.vim**: 一个基于首尔色彩的低对比度 Vim 颜色方案&#xff0c;适用于 256 色终端或 GVim。 2. **vim-easy-align**: Vim 插件&#xff0c;用于对齐文本。 3. **vim-go**: Vim 的 Go 语言插件&#xff0c;支持语法高亮、自动缩进等。 4. **coc.nvim**: 集成了 LSP…

GESP CCF C++ 二级认证真题 2024年6月

第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级&#xff0c;那他可以选择的认证语言有几种&#xff1f;&#xff08; &#xff09; A. 1 B. 2 C. 3 D. 4 第 2 题 下面流程图在yr输入2024时&#xff0c;可以判定yr代表闰年&#xff0c;并输出 2月…

介绍一款数据准实时复制(CDC)中间件 `Debezium`

简介 文章开头先介绍一下什么是CDC。数据准实时复制(CDC)是目前行内实时数据需求大量使用的技术。常用的中间件有Canal、Debezium、Flink CDC等 下面我们做一下对比 各有优缺点吧,本主要介绍一下Debezium中间件。 Debezium是什么 Debezium是一个为变更数据捕获(CDC)提供…

Windows图形界面(GUI)-SDK-C/C++ - 列表框(List)

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 列表框(List) 控件样式 创建控件 初始控件 消息处理 示例代码 列表框(List) 控件样式 列表框&#xff08;ListBox&#xff09;是Windows图形界面开发中常用的控件&#xff0c;允许用户从…

力扣第230题“二叉搜索树中第K小的元素”

在本篇文章中&#xff0c;我们将详细解读力扣第230题“二叉搜索树中第K小的元素”。通过学习本篇文章&#xff0c;读者将掌握如何使用中序遍历来找到二叉搜索树中的第K小的元素&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于…

OpenAI终止对中国提供API服务,对国内AI市场产生重大冲击?

6月25日&#xff0c;OpenAI突然宣布终止向包括中国在内的国家地区提供API服务&#xff0c;本月9日这一政策已经正式生效了&#xff01; 有人说&#xff0c;这个事件给中国AI行业带来很大冲击&#xff01;是这样吗&#xff1f;在展开讨论前&#xff0c;我们先来看看什么是API服务…

会话固定攻击

会话固定攻击&#xff08;Session Fixation Attack&#xff09;是一种网络攻击&#xff0c;攻击者试图诱骗受害者使用攻击者指定的会话ID&#xff0c;以便在受害者登录后&#xff0c;攻击者能够窃取受害者的会话并冒充受害者进行操作。下面是一个形象的例子来解释会话固定攻击&…

8080端口映射外网不成功的原因

最近因为需要将群晖nas的8080端口映射到外网&#xff0c;但是路由器已经成功设置&#xff0c;群晖nas上对应端口的服务也已经部署好&#xff0c;可是如论如何也从外网访问不到群晖服务器上&#xff0c;但是同样是5000端口&#xff0c;群晖的外网管理端口就可以&#xff0c;最后…

在linux x86服务器安装jdk

安装JDK&#xff08;Java Development Kit&#xff09;在Linux x86 服务器上可以按照以下步骤进行操作。以下步骤假设你有root权限或者sudo权限。 1. 下载JDK安装包 首先&#xff0c;你需要从Oracle官网或者OpenJDK官网下载JDK的安装包。可以选择对应的版本&#xff0c;比如J…

jmeter-beanshell学习8-for循环

一个稍微有点难度的东西 要把响应结果的所有名字都取出来&#xff0c;然后怎么处理看自己需求。比如找某个人是不是在这里&#xff0c;或者把所有人都写进一个文档&#xff0c;我就不编场景了 第一步想要取出所有名字&#xff0c;还得靠万能的正则表达式提取器&#xff0c;jso…