一天一个设计模式---组合模式

news2024/11/18 13:40:36

基本概念

组合模式是一种结构型设计模式,它允许客户端统一对待单个对象和对象的组合。组合模式通过将对象组织成树形结构,使得客户端可以一致地使用单个对象和组合对象。

主要角色:

  1. Component(组件): 定义组合中的对象接口,可以是抽象类或接口,声明了用于管理子组件的方法。
  2. Leaf(叶子): 表示组合中的叶子节点对象,实现了Component接口。叶子节点没有子节点。
  3. Composite(复合): 表示组合中的具有子节点的复合对象,实现了Component接口。复合对象可以包含叶子节点和其他复合对象,形成递归结构。

优点

  • 统一接口: 客户端通过统一的接口处理单个对象和组合对象,不需要区分它们的具体类型。
  • 灵活性: 客户端可以以相同的方式处理单个对象和组合对象,从而使得系统更加灵活。
  • 可扩展性: 可以方便地添加新的组件,无需修改客户端代码。

结构

在这里插入图片描述

示例代码

Component 定义了组件的接口,Leaf 表示叶子节点,Composite 表示复合节点。客户端可以通过统一的 operation 方法处理单个对象和组合对象。

// Component
class Component {
  constructor(name) {
    this.name = name;
  }

  operation() {
    throw new Error('Operation not supported');
  }
}

// Leaf
class Leaf extends Component {
  operation() {
    console.log(`Leaf ${this.name} operation`);
  }
}

// Composite
class Composite extends Component {
  constructor(name) {
    super(name);
    this.children = [];
  }

  add(child) {
    this.children.push(child);
  }

  remove(child) {
    const index = this.children.indexOf(child);
    if (index !== -1) {
      this.children.splice(index, 1);
    }
  }

  operation() {
    console.log(`Composite ${this.name} operation`);
    this.children.forEach(child => child.operation());
  }
}

// Usage
const leaf1 = new Leaf('1');
const leaf2 = new Leaf('2');

const composite = new Composite('Composite');
composite.add(leaf1);
composite.add(leaf2);

const leaf3 = new Leaf('3');
const leaf4 = new Leaf('4');

const subComposite = new Composite('SubComposite');
subComposite.add(leaf3);
subComposite.add(leaf4);

composite.add(subComposite);

composite.operation();

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

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

相关文章

Express安装与基础使用

一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架, 官方网站: Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 中文文档: 路由 - Express 中文文档 简单来说&am…

Vulnhub靶机:driftingblues 2

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:driftingblues2(10.0.2.18) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entr…

逸学Docker【java工程师基础】3.3Docker安装nacos

docker pull nacos/nacos-server docker network create nacos_network #创建容器网络 docker run -d \ --name nacos \ --privileged \ --cgroupns host \ --env JVM_XMX256m \ --env MODEstandalone \ --env JVM_XMS256m \ -p 8848:8848/tcp \ -p 9848:9848…

一文教你使用 ChatGPT API function calling

一文教你使用 ChatGPT API function calling Function call如何理解Function call如何调用? Function call 如何理解Function call 函式呼叫(function calling) 可说是这次ChatGPT API 更新的杀手级更新。所谓函式呼叫,就是让你把外部函式的形状写入Cha…

【Java IO分类】从传输方式和数据操作上理解 Java IO分类

Java IO - 分类 IO理解分类 - 从传输方式上字节流字符流字节流和字符流的区别字节转字符Input/OutputStreamReader/Writer IO理解分类 - 从数据操作上文件(file)数组([])管道操作基本数据类型缓冲操作打印对象序列化反序列化转换 IO理解分类 - 从传输方式上 从数据传输方式或者…

CSS3十大滤镜效果详解

滤镜效果 类似于美颜相机、美图秀秀这样的美颜工具,能够让我们轻松地应用多种特效,例如转换为黑白照片、复古风格化、调整亮度等。在之前仅凭CSS几乎很难做到这些效果。 但在CSS3的语法中,所有的这些视觉特效都是通过“filter”属性来快速实…

最全 chrome driver

超全chrome和driver的对应链接 https://raw.githubusercontent.com/GoogleChromeLabs/chrome-for-testing/main/data/latest-patch-versions-per-build-with-downloads.json 从这个链接中直接找对应的chrome和driver 复制链接下载。 注意最新版的在一些文章里的链接是找不到的…

论文笔记(四十)Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 学习 6D 抓握政策3.1 背景3.2 从点云抓取 6D 策略3.3 联合运动和抓握规划器的演示3.4 行为克隆和 DAGGER3.5 目标--辅助 DDPG3.6 对未知物体进行微调的后视目标 4. 实…

深度学习记录--偏差/方差(bias/variance)

误差问题 拟合神经网络函数过程中会出现两种误差:偏差(bias)和方差(variance) 偏差和误差的区别 欠拟合(underfitting) 当偏差(bias)过大时,如左图,拟合图像存在部分不符合值,称为欠拟合(underfitting) 过拟合(overfitting) …

软件测试|使用Python生成PDF文件

简介 PDF(Portable Document Format)是一种常用的文档格式,具有跨平台兼容性、保真性、安全性和交互性等特点。我们日常生活工作中的合同、报告、论文等通常都采用PDF格式,以确保文档在不同的操作系统(例如 Windows、…

鸿蒙开发工程师会不会有很好的就业前景?

一,鸿蒙带动IT开发和应用整体结构的变革 1月11日,以鸿蒙为首的华为概念股大幅走强,创业板创识科技拉升封板,传智教育、智度股份、高新发展、立达信、吉大正元等多股涨停,华亚电子、九联科技、软通动力、辰奕智能、芯海…

正则化方法介绍

在深度学习中,正则化是一种用于防止模型过拟合的技术。过拟合是指模型在训练数据上表现良好,呆在未见过的测试数据集上表现效果较差的情况。正则化的目标是通过对模型性的参数或层的约束,使其在训练数据上表现的不那么复杂,从而提…

【RTOS】快速体验FreeRTOS所有常用API(10)资源管理

目录 十、资源管理10.1 基本概念10.2 关任务调度器10.3 关中断10.4 实例 十、资源管理 该部分在上份代码基础上修改得来,代码下载链接: https://wwzr.lanzout.com/iqBYJ1lauxof 密码:9adb 该代码尽量做到最简,不添加多余的、不规范的代码。 内…

开源云真机平台-Sonic平台-python自定义脚本-批量导出monkey测试日志并抓取logcat日志

【主要功能】 开源云真机平台-Sonic平台-python自定义脚本: 1、批量导出monkey测试日志 2、抓取logcat日志 3、将导出的日志批量复制到局域网内的制定电脑上进行收集整理; 4、每一台设备的monkey日志、logcat日志单独存储,并以日期设备序…

【CSDN年度征文】关于三掌柜2023全年回顾和总结

目录 前言 顺利转正 被任命为项目经理 印象深刻的实战经历:项目重大版本上线 系统学习新技术的心得体会 获得腾讯云开发者社区优秀作者奖 想要安利给所有人的开发工具 技术大会招募 线下沙龙圆桌主持 新书发布上市 受邀直播探会 接受采访 组织1024程序…

css mask使用,背景透明,图片裁切

1 语法 mask: url(image.png); 使用位图来做遮罩mask: url(image.svg#star); 使用SVG图形中的形状来做遮罩mask: linear-gradient(#000 , transparent) 接受类似背景参数的渐变来做遮罩2 示例 2.1 背景透明 {background: url(im…

算法第二十天-丑数Ⅱ

丑数Ⅱ 题目要求 解题思路 题目的要求是让我们生成第n个丑数。如果考虑逐个遍历自然数是否为丑数,一定会超时。这里推荐使用生成的办法。 要生成第n个丑数,我们必须从第一个丑数1开始,向后逐渐的寻找。丑数只包含2,3&#xff0c…

Tensorflow2.0笔记 - Broadcasting和Tile

关于broadcasting的介绍,参考这篇文章。 https://blog.csdn.net/python_LC_nohtyp/article/details/104097417 import tensorflow as tf import numpy as nptf.__version__#关于broadcasting的介绍,参考这篇文章 #https://blog.csdn.net/python_LC_noht…

【Vue3】3-3 : 组件之间是如何进行互相通信的

本书目录:点击进入 一、组件之间为什么要做通信 二、组件之间通信方式 2.1、父传子:由传递属性实现 stage 1:申明 (即定义) stage 2:注册 stage 3:使用 【示例】:父组件将 tit…

前端动画特效分享(附在线预览)

分享几款不错的动画特效源码 其中有CSS动画、canvas动画、js小游戏等等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 canvas爱心代码动画 爱心代码动画特效 由里向外不断的产生的小爱心形成一个巨大的爱心动画 以下图片…