设计模式之组合实体模式

news2025/1/14 18:43:34

        在编程的奇幻森林里,树木与枝叶错综复杂,如何让代码世界井然有序?组合实体模式(Composite Pattern)就像一位高明的园艺师,它以一种巧妙的方式,将个体与整体统一管理,让无论是单个对象还是由对象组成的复杂结构,都能被同等对待,实现了一种优雅的递归结构。今天,我们就来一场深度探索,看看组合实体模式是如何在Java的王国里施展它的魔法的!

组合实体模式:统一即是力量

        想象你正在构建一个文件系统管理器,需要处理文件和目录。文件是叶子节点,目录则是包含文件和子目录的树枝。组合实体模式允许你用相同的方式处理文件和目录,无论你是要查看、删除还是移动它们,就像是在指挥一支整齐划一的队伍。

核心理念

        组合实体模式(Composite Entity Pattern)是特定于企业级JavaBeans (EJB) 持久化机制中的设计模式,主要用于简化EJB实体bean在处理关联对象时的复杂性。该模式在EJB框架内工作,目的是高效地管理和持久化具有复杂关联关系的对象图。以下是该模式的详细说明:

组合实体模式的核心在于定义一个接口,用于描述所有对象(无论是基础对象还是组合对象)共有的操作,使得用户可以用一致的方式处理单个对象和对象组合。它包括两种类型的角色:

  • Component(组件):定义了所有组件(包括叶子和容器)的共性操作。
  • Leaf(叶子):代表没有子组件的基本对象。
  • Composite(复合体):除了实现Component接口,还可以包含子组件,管理子组件的添加、移除等操作。

场景漫步

  • 目录结构管理:文件系统、菜单栏构建。
  • 图形界面元素:组织按钮、窗口、菜单等UI元素。
  • 组织结构管理:公司组织结构,员工与部门的关系。

注意事项与雷区

  • 谨慎使用深度递归:过深的递归可能导致栈溢出。
  • 平等对待原则:确保叶子和容器组件对外提供的接口一致。
  • 清晰界定边界:明确哪些操作应该由组合体实现,哪些应该由客户端代码处理。

优缺点大观

优点

  • 统一接口:简化客户端代码,对单个对象和组合对象的操作统一。
  • 灵活扩展:易于新增组件类型,符合开闭原则。
  • 清晰结构:自然映射树状结构,提高代码可读性。

缺点

  • 滥用风险:不是所有的情况都需要用组合模式,过度使用可能导致设计复杂。
  • 性能考量:递归遍历可能影响性能。

Java代码演绎

// Component: 定义基本操作接口
interface FileSystemItem {
    void display();
    void add(FileSystemItem item);
    void remove(FileSystemItem item);
}

// Leaf: 实现叶子节点
class File implements FileSystemItem {
    private String name;
    public File(String name) { this.name = name; }
    public void display() { System.out.println(name); }
    public void add(FileSystemItem item) { throw new UnsupportedOperationException(); }
    public void remove(FileSystemItem item) { throw new UnsupportedOperationException(); }
}

// Composite: 实现容器节点
class Directory implements FileSystemItem {
    private List<FileSystemItem> items = new ArrayList<>();
    private String name;
    public Directory(String name) { this.name = name; }
    public void display() {
        System.out.println(name);
        for (FileSystemItem item : items) {
            item.display();
        }
    }
    public void add(FileSystemItem item) { items.add(item); }
    public void remove(FileSystemItem item) { items.remove(item); }
}

// 使用示例
public class FileSystemDemo {
    public static void main(String[] args) {
        Directory root = new Directory("root");
        Directory documents = new Directory("documents");
        File file1 = new File("file1.txt");
        
        root.add(documents);
        documents.add(file1);
        
        root.display();
    }
}

对比与碰撞

  • 与装饰器模式:两者都能动态扩展对象功能,但组合实体模式着重于构建对象的树形结构,而装饰器模式侧重于动态添加责任。
  • 与迭代器模式:组合实体模式中的复杂结构常与迭代器模式结合使用,以方便遍历。

        组合实体模式,就像是编程世界里的炼金术,它将复杂度隐藏于简单接口之后,让代码森林变得井然有序。在你的下一个项目中,不妨考虑是否需要这把“统一”的钥匙,打开管理复杂结构的大门。让我们一起,用代码编织更加优雅的森林吧!

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

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

相关文章

Android使用kts上传aar到JitPack仓库

Android使用kts上传aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑. 1.创建项目(library方式) 由于之前用鸿神的w…

关于Clion开发stm32printf重定向问题简单解决问题方法

title: 关于Clion开发stm32printf重定向问题简单解决问题方法 tags: STM32Clion 参考来源1 这是另一种方法 在printf 重定向的基础上加上 一句 setbuf(stdout,NULL); 参考来源2 自己写的笔记啦

深入理解vector 【C++】

一、vector的介绍&#xff1a; 1.vector是表示可变大小的顺序容器。 2.就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&am…

国产化改造之容器迁移指导(未完)

一、背景 信创即信息技术应用创新的简称,涵盖了国产软件、国产芯片以及云计算等各个方向,也可以理解为常说的“ZZKK(自主可控)”, ZZKK是指对国内企事业单位应用系统中关键软硬件部件的安全性、可靠性、性能稳定性、安全接入等方面进行评估和测试的过程。信创的发展核心就…

一对一WebRTC视频通话系列(二)——websocket和join信令实现

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客&#xff1a; 一对一WebRTC视频通话系列&#xff08;一&#xff09;—— 创建页面并显示摄像头画面 websocket和join信令…

下载Node.js及其他环境推荐nvm

文章目录 项目场景&#xff1a;下载Node.js环境配置配置环境变量 安装脚手架安装依赖安装淘宝镜像安装 cnpm&#xff08;我需要安装&#xff09;nvm 安装 Node.js &#xff08;推荐&#xff09; 项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目…

Java毕业设计 基于SSM SpringBoot vue宠物领养平台

Java毕业设计 基于SSM SpringBoot vue宠物领养平台 SSM 宠物领养平台 功能介绍 首页 图片轮播 新闻信息 新闻类型 新闻详情 宠物百科 宠物百科类型 宠物百科详情 宠物 宠物类型 宠物详情 立即领养 留言 论坛 发布帖子 登录 个人中心 宠物收藏 宠物领养订单 后台管理 登录注…

pymeshlab创建给定水平半径、垂直半径和水平细分以及垂直细分的圆环并保存(torus)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 # pymeshlab需要导入&#xff0c;其一般被命名为ml import pymeshlab as ml# 首先需…

TCP重传机制——快速重传

TCP 有一种快速重传机制&#xff0c;它不以时间为驱动&#xff0c;而是以数据驱动重传。 在上图&#xff0c;发送方发出了 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 份数据&#xff1a; 第一份 Seq1 先送到了&#xff0c;于是就 Ack 回 2&#xff1b;结果 Seq2…

Nutch库入门指南:利用Java编写采集程序,快速抓取北京车展重点车型

概述 在2024年北京车展上&#xff0c;电动汽车成为全球关注的焦点之一。这一事件不仅吸引了全球汽车制造商的目光&#xff0c;也突显了中国市场在电动汽车领域的领先地位。117台全球首发车的亮相&#xff0c;其中包括30台跨国公司的全球首发车和41台概念车&#xff0c;彰显了中…

buuctf-misc-26.后门查杀

26.后门查杀 题目&#xff1a;火绒D盾查杀关键文件获取flag 下载完文件&#xff0c;我们可以用火绒进行查杀后门&#xff0c;一般解压后&#xff0c;火绒会自动查杀到病毒文件 病毒查杀-自定义查杀 找到了需要注意的文件&#xff0c;用vscode打开这个html,可以发现和md5比较相…

【副本向】Lua副本逻辑

副本生命周期 OnCopySceneTick() 子线程每次心跳调用 --副本心跳 function x3323_OnCopySceneTick(elapse)if x3323_g_IsPlayerEnter 0 thenreturn; -- 如果没人进入&#xff0c;则函数直接返回endif x3323_g_GameOver 1 thenif x3323_g_EndTick > 0 thenx3323_CountDown…

Vue进阶之Vue项目实战(一)

Vue项目实战 项目搭建初始化eslint版本约束版本约束eslint配置 stylelintcspellcz-githusky给拦截举个例子 zx 项目搭建 node版本&#xff1a;20.11.1 pnpm版本&#xff1a;9.0.4 初始化 vue3最新的脚手架 pnpm create vite byelide-demo --template vue-ts pnpm i pnpm dev…

020、Python+fastapi,第一个Python项目走向第20步:ubuntu 24.04 docker 安装mysql8、redis(一)

系列文章 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 docker安装起来比较方便&#xff0c;不影响系统整体&#xff0c;和前面虚拟环境有异曲同工之妙&#xff0c;今天把老笔记本T400拿出来装了个ubuntu24…

【分布式系统】FLP、CAP、BASE、ACID理论简介

分布式系统一致性模型 在说FLP&#xff0c;CAP&#xff0c;BASE&#xff0c;ACID理论前&#xff0c;必须先说说分布式系统的一致性模型&#xff0c;它是其他理论的基础知识。 依次介绍几个相关的概念&#xff1a; 分布式系统是由多个不同的服务节点组成&#xff0c;节点与节…

VMware虚拟机安装Linux(CentOS)【超详细】

参考大佬文章&#xff1a;VMware虚拟机安装Linux教程(超详细)_vmware安装linux虚拟机-CSDN博客 目录 一、获取映射文件 二、新建虚拟机 三、安装操作系统 四、切换系统用户 一、获取映射文件 参考大佬文章获取映射文件&#xff0c;以及对应修改后缀名的方法 二、新建虚拟…

电阻 电容 电感

电阻理论基础 电阻定义 电阻决定式 温度对电阻的影响 一般电阻都是在-200-500ppm这个范围内 电阻选型 贴片电阻的标值 数字位数 3位和4位 字母R 除了数字和字母R的其他标注 需要查表 电阻精度 电阻功率和温度的关系 电阻的额定电压 零欧姆电阻 零欧姆电阻又称为跨…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 当我们点击 submit 提…

【云原生】Docker 实践(四):使用 Dockerfile 文件的综合案例

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

【多数组合 数学 字符串】2514. 统计同位异构字符串数目

本文涉及知识点 多数组合 数学 字符串 LeetCode2514. 统计同位异构字符串数目 给你一个字符串 s &#xff0c;它包含一个或者多个单词。单词之间用单个空格 ’ ’ 隔开。 如果字符串 t 中第 i 个单词是 s 中第 i 个单词的一个 排列 &#xff0c;那么我们称字符串 t 是字符串…