组合模式 (Composite Pattern)

embedded/2024/11/27 14:38:33/

组合模式 (Composite Pattern)

组合模式是一种 结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端可以用统一的方式处理单个对象和组合对象。


原理

  1. 核心思想
    • 将对象的“部分”与“整体”组织成树形结构,以统一的方式操作单个对象和组合对象。
    • 客户端无需关心对象是简单的还是复杂的,它们都遵循相同的接口。
  2. 适用场景
    • 表示对象的 部分-整体 层次结构。
    • 希望客户端对单个对象和组合对象进行一致操作。
  3. 参与角色
    • Component(抽象构件):为组合中的对象声明接口。
    • Leaf(叶子节点):定义组合中的叶子对象。
    • Composite(容器构件):定义有子部件的对象,存储子部件并实现 Component 接口。

优点

  1. 一致性操作:客户端代码可以一致地操作简单对象和组合对象,无需关心具体类型。
  2. 灵活扩展:可以动态地增加和删除组合中的节点。
  3. 树形结构:非常适合用于表示复杂的层次结构。

缺点

  1. 复杂性增加:由于需要支持递归组合,代码可能变得复杂。
  2. 不易限制类型:在某些场景中,可能希望对子节点类型施加限制,但组合模式的设计使其较难实现。

示例代码

场景描述

设计一个文件系统,包含文件和文件夹,文件夹可以包含文件或子文件夹。用户可以查看文件系统的内容,统一显示文件和文件夹信息。


1. 定义抽象构件
// 抽象构件
public interface FileSystemComponent {void show(); // 显示组件信息
}

2. 创建叶子节点
// 叶子节点:文件
public class File implements FileSystemComponent {private String name;public File(String name) {this.name = name;}@Overridepublic void show() {System.out.println("File: " + name);}
}

3. 创建容器构件
// 容器节点:文件夹
import java.util.ArrayList;
import java.util.List;public class Folder implements FileSystemComponent {private String name;private List<FileSystemComponent> children = new ArrayList<>();public Folder(String name) {this.name = name;}public void add(FileSystemComponent component) {children.add(component);}public void remove(FileSystemComponent component) {children.remove(component);}@Overridepublic void show() {System.out.println("Folder: " + name);for (FileSystemComponent child : children) {child.show(); // 递归调用子节点的 show 方法}}
}

4. 客户端代码
public class CompositePatternExample {public static void main(String[] args) {// 创建文件File file1 = new File("file1.txt");File file2 = new File("file2.txt");File file3 = new File("file3.txt");// 创建文件夹Folder folder1 = new Folder("folder1");Folder folder2 = new Folder("folder2");Folder rootFolder = new Folder("root");// 组合文件和文件夹folder1.add(file1);folder1.add(file2);folder2.add(file3);rootFolder.add(folder1);rootFolder.add(folder2);// 显示文件系统结构rootFolder.show();}
}

输出结果
Folder: root
Folder: folder1
File: file1.txt
File: file2.txt
Folder: folder2
File: file3.txt

UML 类图

           +-----------------------+| FileSystemComponent   |+-----------------------+| + show()              |+-----------------------+^              ^|              |+----------------+     +----------------+|      File       |     |     Folder     |+----------------+     +----------------+| + show()       |     | + add()        ||                |     | + remove()     |+----------------+     | + show()       |+----------------+|+----------------+| List<FileSystemComponent> |+----------------+

使用场景

  1. 文件系统:文件和文件夹的树形表示。
  2. 组织结构:公司组织中部门和员工的层次结构。
  3. UI组件:如窗口、面板、按钮等组件的嵌套组合。

总结

  • 组合模式非常适合用于表示复杂的层次结构,并提供了一致的操作接口。
  • 它使得客户端代码能够轻松操作简单对象和组合对象,极大地提高了系统的灵活性。
  • 然而,在复杂场景中,设计和实现可能会变得困难,需要合理规划对象的组合关系。

http://www.ppmy.cn/embedded/140921.html

相关文章

CentOS 环境使用代理下载数据失败-EOF occurred in violation of protocol (_ssl.c:1002)

我的代码如下&#xff0c;主要是通过yfinance包下载历史交易数据&#xff1a; import yfinance as yfdata yf.download(000001.SZ, start2017-01-01, end2019-01-01) data 错误现象 Failed to get ticker 000001.SZ reason: HTTPSConnectionPool(hostquery1.finance.yahoo.…

为什么DDoS防御很贵?

分布式拒绝服务攻击&#xff08;DDoS攻击&#xff09;是一种常见的网络安全威胁&#xff0c;通过大量恶意流量使目标服务器无法提供正常服务。DDoS防御是一项复杂且昂贵的服务&#xff0c;本文将详细探讨为什么DDoS防御如此昂贵&#xff0c;并提供一些实用的代码示例和解决方案…

Oracle 深入学习 Part 9: Storage Structure and Relationships(存储结构与关系)

在数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;Segment&#xff08;段&#xff09;、Extent&#xff08;区块&#xff09; 和 Block&#xff08;块&#xff09; 是描述数据库物理存储结构的三个重要概念。这些概念帮助理解数据库是如何在磁盘等存储设备上组织和管…

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言&#xff1a; 该类博客的学习是基于b站黑马视频springbootvue视频学习&#xff01;具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍&#xff08;需求&#xff09;。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…

.Net与C#

.NET 与 C# 的关系 .NET 是一个由微软开发的软件框架&#xff0c;它提供了一套用于开发、运行和部署应用程序的工具和库。C# 是一种面向对象的编程语言&#xff0c;它是专门为.NET平台设计的。以下是.NET与C#之间关系的详细说明&#xff1a; 目标平台&#xff1a;C# 是.NET平…

微信小程序自定义图片预览操作按钮(解决api预览时不能删除提交服务器等自定义操作)

概述&#xff1a; 本人在做图片预览的时候&#xff0c;希望能够根据预览的情况&#xff0c;实时删除操作。 微信小程序提供的api函数&#xff1a;wx.previewImage&#xff0c;官方说明&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previ…

初阶数据结构之队列的实现

1 队列的定义 什么是队列呢&#xff1f;队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作。队列具有先进先出FIFO(First In First Out)的特性。 队头&#xff1a;删除数据的一端称为队头。 队尾&#xff1a;插入数据的一端称为队尾。 2 队列底层结构…

【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、将日志加到线程池 1.1、Thread类 1.2、ThreadPool类 1.2.1、HandlerTask() 1.2.2、其他公有成员函数 1.3、主函数 2、…