当前位置: 首页 > news >正文

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

组合模式简绍

组合模式(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 节点可以是文本节点也可以是包含其他节点的元素节点。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于单片机的无线宠物自动喂食系统设计
  • 什么是L2范数
  • 用户态缓存:环形缓冲区(Ring Buffer)
  • 电力施工作业安全行为检测图像数据集
  • JavaWeb--纯小白笔记06:使用Idea创建Web项目,Servlet生命周期,注解,中文乱码解决
  • 硬件工程师笔试面试——晶振
  • 思通数科开源产品:免费的AI视频监控卫士安装指南
  • git reflog 和 git log 的详解和区别
  • 本地git仓库配置远程仓库的地址
  • 如何在WordPress中添加事件Schema(分步指南)
  • 处理京东商品详情信息爬取中的验证码问题
  • 【基础算法总结】模拟篇
  • Java多线程大全
  • Oracle数据库中什么情况下需要使用游标
  • Hive自定义函数——简单使用
  • @angular/forms 源码解析之双向绑定
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【翻译】babel对TC39装饰器草案的实现
  • Akka系列(七):Actor持久化之Akka persistence
  • Apache Spark Streaming 使用实例
  • hadoop集群管理系统搭建规划说明
  • leetcode-27. Remove Element
  • LeetCode29.两数相除 JavaScript
  • nfs客户端进程变D,延伸linux的lock
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Web Storage相关
  • 基于webpack 的 vue 多页架构
  • 解析带emoji和链接的聊天系统消息
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 微服务入门【系列视频课程】
  • 数据库巡检项
  • 选择阿里云数据库HBase版十大理由
  • ​2020 年大前端技术趋势解读
  • ​力扣解法汇总946-验证栈序列
  • ​批处理文件中的errorlevel用法
  • #git 撤消对文件的更改
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #数据结构 笔记一
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1)Android开发优化---------UI优化
  • (14)Hive调优——合并小文件
  • (4)事件处理——(7)简单事件(Simple events)
  • (c语言)strcpy函数用法
  • (附源码)ssm高校实验室 毕业设计 800008
  • (三)模仿学习-Action数据的模仿
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .ai域名是什么后缀?
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET6实现破解Modbus poll点表配置文件
  • [ 手记 ] 关于tomcat开机启动设置问题