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

devtools/2024/9/23 18:39:15/

组合模式简绍

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样,可以在不知道对象具体类型的条件下操作对象集合。

组合模式主要包含三种角色:

  • Component(组件):声明一个接口,在适当情况下,此接口被叶节点和容器节点共享。
  • Leaf(叶节点):定义终端对象。
  • Composite(容器节点):定义具有子部件的那些部件的行为。存储子部件。 组合模式的应用场景

组合模式的优缺点

组合模式的优点
  • 一致性:客户端可以一致地处理单个对象和组合对象。
  • 灵活性:可以很容易地添加新的叶子节点或组合节点。
  • 透明性:客户端不需要知道对象的具体类型就可以操作对象。
组合模式的缺点
  • 复杂性:对于简单操作,组合模式可能会引入不必要的复杂性。
  • 额外开销:组合模式可能会导致额外的内存和 CPU 开销,尤其是在处理大量对象时

UML图

在这里插入图片描述

定义一个公共接口或抽象类,它声明了所有叶子节点和容器节点共有的操作。

package CompositePatternModel;public interface Component {void test();Component getChild(int i);public void operation();public void add(Component component);
}

实现 Component 接口中定义的操作,但不关心其他与子节点相关的操作。

package CompositePatternModel;import java.util.ArrayList;
import java.util.List;public class Composite implements Component{private String name;private List<Component> children = new ArrayList<>();public Composite(String name){this.name = name;}@Overridepublic void test() {}@Overridepublic Component getChild(int i) {return children.get(i);}@Overridepublic void operation() {System.out.println("Composite " + name + " operation");for (Component c : children) {c.operation();}}@Overridepublic void add(Component component) {children.add(component);}}

实现 Component 接口中定义的操作,并且实现与子节点相关的操作。客户端可以一致地对待单个对象和组合对象。

package CompositePatternModel;public class Pattern implements  Component{private String name;public Pattern(String name){this.name = name;}@Overridepublic void test() {System.out.println("test");}@Overridepublic Component getChild(int i) {System.out.println("getChild");return null;}@Overridepublic void operation() {System.out.println("operation: d" + name);}@Overridepublic void add(Component component) {System.out.println("sdf"+ component);}}

客户端可以一致地对待单个对象和组合对象。

package CompositePatternModel;public class Main {public static void main(String[] args) {Pattern pattern = new Pattern("pattern1");Pattern pattern1 = new Pattern("pattern2");Composite composite = new Composite("Comp");composite.add(pattern);composite.add(pattern1);composite.operation();}
}
  1. 表示部分-整体层次结构
    当你需要表示一个具有层次结构的对象集合时,组合模式是非常有用的。这种结构通常包含多个层次,每个层次上的对象可以是一个独立的实体(叶节点),也可以是一个包含其他对象的容器(组合节点)。
    示例:

    • 文件系统中的目录和文件:目录可以包含其他目录和文件。
    • 组织结构图:部门可以包含其他部门或员工。
    • UI控件:一个复合控件可以包含其他控件(如面板包含按钮、文本框等)
  2. 透明地处理单个对象和组合对象
    当客户端代码需要以一致的方式处理单个对象和组合对象时,组合模式可以让客户端无需关心处理的是单个对象还是组合对象。
    示例:

    • 图形编辑器:图形可以是单独的线条、矩形等基本图形,也可以是由多个基本图形组成的复合图形。
    • 渲染引擎:渲染对象可以是单一的几何体,也可以是由多个几何体组成的复杂场景。
  3. 动态地增删对象
    当需要在运行时动态地添加或移除对象,并且这些对象可能是单个实体也可能是包含其他对象的容器时,组合模式可以很好地支持这种需求。

    示例:
    游戏中的场景管理:游戏场景可以包含单个游戏对象,也可以包含其他场景。
    UI 界面构建:一个窗口可以包含多个面板,每个面板又可以包含多个组件。

  4. 需要递归处理的对象集合
    当需要对一个层次结构进行递归处理时,组合模式可以简化递归逻辑。
    示例:

    • 企业组织结构的遍历:遍历整个公司的部门和员工。
    • 文件系统的遍历:递归地遍历目录和文件。
  5. 需要一致的接口
    当希望在不同类型的对象之间提供一致的接口时,组合模式可以确保所有的对象(无论是叶子还是组合节点)都遵循相同的接口定义。

示例:
操作系统中的文件和目录:文件和目录都需要支持读写、删除等操作。
网页中的 DOM 结构:DOM 节点可以是文本节点也可以是包含其他节点的元素节点。

组合模式提供了一种优雅的方式来组织和操作层次结构中的对象,使得客户端可以在不知道对象具体类型的情况下操作对象集合。这种模式在很多领域都有广泛的应用,特别是在需要表示层次关系的场景中。


http://www.ppmy.cn/devtools/116119.html

相关文章

Excel常用函数大全

Excel常用函数介绍与示例应用 在Excel中&#xff0c;函数是进行数据处理和分析的强大工具。对于新手来说&#xff0c;掌握一些基本的函数使用方法能够大大提升工作效率。以下是一份通俗易懂、适合新手的Excel函数使用方法总结&#xff1a; 1. 求和函数&#xff08;SUM&#x…

Docker本地部署Chatbot Ollama搭建AI聊天机器人并实现远程交互

文章目录 前言1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 前言 本文主要分享如何在群晖NAS本地部署并运行一个基于大语言模型Llama 2的个人本地聊天机器人并结合内网穿透工具…

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

C++ 面试模拟02

第一部分&#xff1a;基础知识 什么是拷贝构造函数和赋值运算符&#xff1f;它们之间有什么区别&#xff1f;在 C 中&#xff0c;const 关键字的作用是什么&#xff1f;有哪些常见用法&#xff1f;C 中的内存管理机制是怎样的&#xff1f;如何避免内存泄漏&#xff1f;虚函数&…

k8s的NodeIP、PodIP、ClusterIP、ExternalIP

1.NodeIP K8s集群由Master Node与Worker Node组成。 Node&#xff1a;组成k8s集群的机器&#xff0c;可以是物理机或虚拟机。 Master Node &#xff1a;管理节点也叫控制平面主要负责管理控制方面。 Worker Node&#xff1a;&#xff1a;工作节点用于部署处理业务的工作负载或p…

植物大战僵尸【源代码分享+核心思路讲解】

植物大战僵尸已经正式完结&#xff0c;今天和大家分享一下&#xff0c;话不多说&#xff0c;直接上链接&#xff01;&#xff01;&#xff01;&#xff08;如果大家在运行这个游戏遇到了问题或者bug&#xff0c;那么请私我谢谢&#xff09; 大家写的时候可以参考一下我的代码思…

社交电商中“信任”基础与“链动 2+1 模式 O2O 商城小程序”的价值探索

摘要&#xff1a;本文深入探讨了在基于社交的商业模式中&#xff0c;“信任”作为重要基础条件的关键作用。详细分析了在产品同质化日益严重的当下&#xff0c;人与人之间口口相传的宣传方式优势。同时&#xff0c;全面引入“链动 21 模式 O2O 商城小程序”&#xff0c;深入阐述…

大数据时代的PDF解析:技术与挑战

在大数据时代&#xff0c;海量信息以不同格式存储&#xff0c;其中 PDF 文件凭借其广泛应用成为了各种业务场景下的主要文档格式。无论是政府文件、企业报告&#xff0c;还是学术论文和技术文档&#xff0c;PDF 都是信息交流的重要媒介。然而&#xff0c;随着信息的爆炸式增长&…