Java特性之设计模式【组合模式】

一、组合模式

概述

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦

何时使用:1、想表示对象的部分-整体层次结构(树形结构) 2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象

优缺点

优点:

  • 组合模式通过递归的形式遍历组合对象,使得对象可以无限层次地嵌套。这样可以更加灵活地表示复杂的结构,并能够方便地对整个结构进行操作
  • 通过组合模式,以统一的方式处理整体和部分,不需要关心当前操作的对象是叶节点还是组合节点,可以统一地进行操作

缺点:

  • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

1. 各个角色介绍

1.1 组件(Component)

  • 定义了组合中所有对象的通用接口,可以是抽象类或接口。它声明了用于访问和管理子组件的方法,包括添加、删除、获取子组件等

1.2 叶子节点(Leaf)

  • 表示组合中的叶子节点对象,叶子节点没有子节点。它实现了组件接口的方法,但通常不包含子组件

1.3 复合节点(Composite)

  • 表示组合中的复合对象,复合节点可以包含子节点,可以是叶子节点,也可以是其他复合节点。它实现了组件接口的方法,包括管理子组件的方法

2. UML图

​ 我们有一个类 Component 对象作为所有对象的通用接口,然后 LeafComposite 分别实现该接口,并通过 Composite 构建非叶子节点和叶子节点,形成树状图,并以中序遍历的形式输出

在这里插入图片描述

3. 具体例子和代码

角色分配

  • Component:抽象组件
  • Leaf:叶子节点(叶子节点下,无组件,继承Component)
  • Composite:组合节点(继承Component)

3.1 抽象组件

  • Component
package com.vinjcent.prototype.composite;import io.swagger.annotations.ApiModelProperty;/*** @author vinjcent* @description 抽象组件* @since 2024/3/11 22:16*/
public abstract class Component {@ApiModelProperty("组件名称")protected String name;public Component(String name) {this.name = name;}/*** 组件操作*/public abstract void operation();/*** 为当前组件添加组件** @param component 需要添加的组件*/public abstract void add(Component component);/*** 移除某一组件** @param component 需要移除的组件*/public abstract void remove(Component component);/*** 根据下标获取子组件** @param index 下标* @return 下标对应组件*/public abstract Component getChild(int index);}

3.2 叶子节点

  • Leaf
package com.vinjcent.prototype.composite;/*** @author vinjcent* @description 叶子节点(叶子节点下,无组件)* @since 2024/3/11 22:20*/
public class Leaf extends Component {public Leaf(String name) {super(name);}public void operation() {System.out.println("Leaf " + name + " is performing operation.");}public void add(Component component) {// 在叶节点中无法添加子节点,可以选择抛出异常或忽略该操作throw new UnsupportedOperationException("Unsupported operation: add");}public void remove(Component component) {// 在叶节点中无法移除子节点,可以选择抛出异常或忽略该操作throw new UnsupportedOperationException("Unsupported operation: remove");}public Component getChild(int index) {// 叶节点没有子节点,返回null或抛出异常return null;}
}

3.3 组合节点

  • Composite
package com.vinjcent.prototype.composite;import io.swagger.annotations.ApiModelProperty;import java.util.ArrayList;
import java.util.List;/*** @author vinjcent* @description 组合节点* @since 2024/3/11 22:44*/
public class Composite extends Component {@ApiModelProperty("子节点")private List<Component> children;public Composite(String name) {super(name);children = new ArrayList<>();}@Overridepublic void operation() {System.out.println("Composite " + name + " is performing operation.");for (Component child : children) {child.operation();}}@Overridepublic void add(Component component) {children.add(component);}@Overridepublic void remove(Component component) {children.remove(component);}@Overridepublic Component getChild(int index) {return children.get(index);}
}

3.4 测试主函数

package com.vinjcent.prototype.composite;/*** @author vinjcent* @description 组合模式* @since 2024/3/11 22:51:07*/
public class Main {public static void main(String[] args) {// 根节点Component root = new Composite("Root");// 叶子节点1、2Component leaf1 = new Leaf("L. one");Component leaf2 = new Leaf("L. two");// 子节点1Component node1 = new Composite("N. one");Component leaf3 = new Leaf("L. three");// 子节点2Component node2 = new Composite("N. two");Component leaf4 = new Leaf("L. four");// 为子节点添加叶子节点node1.add(leaf3);node2.add(leaf4);// 为根节点添加子节点、叶子节点root.add(leaf1);root.add(leaf2);root.add(node1);root.add(node2);// 输出结果,相当于中序遍历root.operation();}}
  • 测试结果

在这里插入图片描述

4. 使用场景

  • 部分、整体场景,如树形菜单,文件、文件夹的管理
    在这里插入图片描述

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

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

相关文章

【研发日记】,Matlab/Simulink开箱报告(十)——Requirements Toolbox

前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;五&#xff09;——S-Fuction模块(C MEX S-Function)》 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;六&#xff09;——S-Fuction模块&#xff08;TLC&#xff09;》 见《开…

java(框架) springboot-1 基础使用+mybaits使用

学习视频&#xff1a;b站黑马java教程 tomcat spring-boot工程内嵌了tomcat服务器 所有请求经过DispatcherServlet(实现servlet接口的类)(核心控制器/前端控制器)处理&#xff0c;再通过DispatcherServlet转发给各个controller。 最后通过DispatcherServlet给浏览器响应数据…

《详解:鸿蒙NEXT开发核心技术》

我们现在都知道鸿蒙作为一个国产的全栈自研系统&#xff0c;经过国家主推后。已经引起人们很大的关注&#xff0c;其中作为开发者来说&#xff1b;许多一线大厂已经与其华为鸿蒙展开原生应用的合作了&#xff0c;目前了解到已经有200家。而之后出现了很多的高薪鸿蒙开发岗位&am…

机试:数塔路径

问题描述: 代码示例: //数塔路径 #include <bits/stdc.h>using namespace std;int main(){ // 算法思想: // 逆推,将最下方和右下方的数字进行比较,哪个大则加上并更新,直至到根节点即为最大 int n;cin >> n; int nums[n1][n1]; // 输入数塔 for(int i 1;i < n…

9、组合模式(结构性模式)

组合模式又叫部分整体模式&#xff0c;它创建了对象组的树形结构&#xff0c;将对象组合成树状结构&#xff0c;以一致的方式处理叶子对象以及组合对象&#xff0c;不以层次高低定义类&#xff0c;都是结点类 一、传统组合模式 举例&#xff0c;大学、学院、系&#xff0c;它们…

wayland(xdg_wm_base) + egl + opengles 渲染使用纹理贴图的旋转 3D 立方体实例(十三)

文章目录 前言一、使用 stb_image 库加载纹理图片1. 获取 stb_image.h 头文件2. 使用 stb_image.h 中的相关接口加载纹理图片3. 纹理图片——cordeBouee4.jpg二、渲染使用纹理贴图的旋转 3D 立方体1. egl_wayland_texture_cube.c2. Matrix.h 和 Matrix.c3. xdg-shell-client-pr…

《C语言都有哪些字符串处理函数?》

目录 17个字符串处理函数 1. gets()--读 2.fgets()--从指定文件内读 3.puts()--输出 4.fputs()--写入到指定文件中 5.strlen()--计算字符串长度 6.strcpy()--复制 7.strncpy()--复制前n个字符 8.strcat()--字符串连接 9.strncat()--将前n个字符连接 10.strcmp()--比…

带你摸透C语言相关内存函数

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

【论文阅读】Vision Mamba:双向状态空间模型的的高效视觉表示学习

文章目录 Vision Mamba:双向状态空间模型的的高效视觉表示学习摘要介绍相关工作用于视觉应用的状态空间模型 方法准备视觉MambaVim块结构细节高效分析计算效率 实验图片分类语义分割目标检测和实例分割消融实验双向SSM分类设计 总结和未来工作 论文地址&#xff1a; Vision Mam…

人工智能测试开发

随着人工智能在各行各业的广泛应用&#xff0c;学习并掌握AI技术在软件测试中的应用变得至关重要。不仅能使你跟上行业的发展趋势&#xff0c;还能提升你的竞争力。而且&#xff0c;市场对具备AI测试技能的测试工程师的需求正日益增长&#xff0c;这使得掌握这些技能能够帮助你…

蓝桥杯算法训练VIP-数组查找及替换

题目 1634: 蓝桥杯算法训练VIP-数组查找及替换 时间限制: 3s 内存限制: 192MB 提交: 1629 解决: 890 题目描述 给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素&#xff0c;同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间&#xff0…

C++初阶

1.缺省参数 给缺省参数的时候&#xff0c;不能声明&#xff0c;定义同时给&#xff0c;只能声明的时候给缺省参数&#xff0c;同时给程序报错&#xff1b; 2.函数重载 C语言不允许同名函数的存在&#xff0c;函数名不能相同&#xff0c;C引入函数重载&#xff0c;函数名可以…