【设计模式】第10节:结构型模式之“组合模式”

news2024/12/23 13:44:51

一、简介

组合模式:将一组对象组织成树形结构,将单个对象和组合对象都看做树中的节点,以统一处理逻辑,并且它利用树形结构的特点,递归地处理每个子树,依次简化代码实现。使用组合模式的前提在于,业务场景必须能够表示成树形结构。

二、 UML类图

请添加图片描述

三、案例

以下是电脑文件系统的案例,文件系统是树形结构的,包含文件、文件夹两种类型的对象。它们都具有获取文件数和获取路径两个方法。

package main
import "fmt"

type FileSystemNode interface {
    CountNumOfFiles() int64
    GetPath() string
}

type File struct {
    path string    
}

func (f File) CountNumOfFiles() int64 {
    return 1
}

func (f File) GetPath() string {
    return f.path
}

type Directory struct {
    path string
    subNodes []FileSystemNode
}

func (d Directory) CountNumOfFiles() int64 {
    numOfFiles := int64(0)
    for i := 0; i < len(d.subNodes); i++ {
        node := d.subNodes[i]
        numOfFiles += node.CountNumOfFiles()
    }
    return numOfFiles
}

func (d Directory) GetPath() string {
    return d.path
}

func (d *Directory) AddSubNode(node FileSystemNode) {
    d.subNodes = append(d.subNodes, node)
}

func NewDirectory(path string) *Directory {
    directory := new(Directory)
    directory.path = path
    return directory
}

func NewFile(path string) *File {
    file := new(File)
    file.path = path
    return file
}

func main () {
    fileSystemTree := NewDirectory("/")
    node_wz := NewDirectory("/wz/")
    node_ab := NewDirectory("/ab/")
    node_xzg := NewDirectory("/xzg/")
    node_wz_a := NewFile("/wz/a.txt")
    node_ab_a := NewFile("/ab/a.txt")
    node_ab_b := NewFile("/ab/b.txt")

    node_wz.AddSubNode(*node_wz_a)
    node_ab.AddSubNode(*node_ab_a)
    node_ab.AddSubNode(*node_ab_b)
    fileSystemTree.AddSubNode(*node_wz)
    fileSystemTree.AddSubNode(*node_ab)
    fileSystemTree.AddSubNode(*node_xzg)

    fmt.Printf("/ files num: %v\n", fileSystemTree.CountNumOfFiles())
    fmt.Printf("/wz/ files num: %v\n", node_wz.CountNumOfFiles())
    fmt.Printf("txt file path: %v\n", node_wz_a.GetPath())
}

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

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

相关文章

【数据结构与算法】JavaScript实现集合与字典

文章目录 一、集合结构1.1.简介1.2.代码实现1.3.集合间的操作 二、字典结构2.1.简介2.2.封装字典 一、集合结构 1.1.简介 集合比较常见的实现方式是哈希表&#xff0c;这里使用JavaScript的Object类进行封装。 集合通常是由一组无序的、不能重复的元素构成。 数学中常指的集…

记录linux运行服务提示报错/bin/java: 没有那个文件或目录

描述&#xff1a;在执行jar启动命令时候提示 没有/bin/java 这个文件或者目录&#xff1b;然后我vi /usr/bin/java&#xff0c;是存在该文件的&#xff1b;那到底是什么问题呢&#xff0c;该不是没有创建软连接吧&#xff1f; 1、执行下述命令先测试下软链接是否有创建 ln -s …

SpringCloud微服务保护方案解读

目录 服务雪崩定义 问题的产生 示例 雪崩产生的几种场景 解决方案 熔断模式 隔离模式&#xff08;仓壁模式 &#xff09; 限流模式 超时处理 总结 服务保护技术对比 服务雪崩定义 我们都知道在微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务…

2023年中国特种运输现状及市场格局分析[图]

特种运输是使用特殊车辆、方案&#xff0c;将特种货物转移至需求地的过程。相对于常规货物&#xff0c;特种货物在本身特性&#xff08;危险品、鲜活货物&#xff09;、价值&#xff08;贵重物品&#xff09;、体积&#xff08;超大货物&#xff09;、重量&#xff08;超重货物…

【AD9361 数字接口CMOS LVDSSPI】C 并行数据 LVDS

接上一部分&#xff0c;AD9361 数字接口CMOS &LVDS&SPI 目录 一、LVDS模式数据路径和时钟信号LVDS模式数据通路信号[1] DATA_CLK[2] FB_CLK[3] Rx_FRAME[4] Rx_D[5&#xff1a;0][5] Tx_FRAME[6]Tx_D[5&#xff1a;0][7] ENABLE[8] TXNRX系列 二、LVDS最大时钟速率和信…

JavaScript对象与原型:揭示编程世界的奥秘

目录 对象&#xff1a;万物皆对象 原型&#xff1a;共享和继承的基石 继承与原型链 对象与原型的关系 对象的创建 原型与原型链 原型继承 总结 在JavaScript中&#xff0c;对象是非常重要的概念之一。它们允许我们以一种结构化的方式存储和组织数据&#xff0c;并提供了…

【ROS教程demo】用C++创建一个ROS节点,发布指令使得小海龟做圆周运动

ROS创建节点发布命令使得小海龟做圆周运动 1.任务需求2.任务分析2.1发布方topic和msg2.2接收方topic和msg2.3目标明确!3.创建ROS节点3.1创建发布方节点pub_pose3.2创建订阅方节点sub_pose1.任务需求 创建一个节点,在其中实现一个订阅者和一个发布者,完成以下功能: 发布者:…

打造中国汽车出海新名片,比亚迪亮相东京车展

作为全球知名的国际车展&#xff0c;东京车展向来都被业界人士誉为“亚洲汽车风向标”。2023年10月25日&#xff0c;第47届东京车展&#xff08;自2023年更名为“日本移动出行展”&#xff09;在东京国际展览中心如期揭幕。 作为中国车企的代表品牌&#xff0c;比亚迪携海豹、海…

40基于MATLAB,使用模板匹配法实现车牌的识别。

基于MATLAB&#xff0c;使用模板匹配法实现车牌的识别。具体包括将原图灰度化&#xff0c;边缘检测&#xff0c;腐蚀操作&#xff0c;车牌区域定位&#xff0c;车牌区域矫正&#xff0c;二值化&#xff0c;均值滤波&#xff0c;切割&#xff0c;字符匹配&#xff0c;最终显示车…

【数据库】Python脚本实现数据库批量插入事务

背景介绍 在工作中可能会遇到需要批量插入的场景, 而批量插入的过程具有耗时长的特点, 再此过程很容易出现程序崩溃的情况.为了解决插入大量数据插入后崩溃导致已插入数据无法清理及未插入数据无法筛出的问题, 需要编写一个脚本记录已插入和未插入的数据, 并可以根据记录的数据…

阿里云服务linux系统CentOs8.5安装/卸载nginx1.15.9

说明&#xff1a;尝试使用CentOs8.5安装nginx1.9.9失败&#xff0c;make的时候报错了&#xff0c;后面降低版本为CentOs7.5安装成功了&#xff0c;参考文章:【精选】centos7安装nginx-1.9.9_linx centos nginx 1.9.9版本 nginx error log file: "/-CSDN博客 一、安装ngin…

Animator中Has Exit Time,融合时间

写这篇文章的原因是&#xff0c;发现有时候SetTrigger后动画没有切换&#xff0c;做实验找到了原因。 一、勾选了Has Exit Time 动画一定会在设定的时间才可能会切换到下个动画片段。 NormalAttack1-->NormalAttack2,结束时间设置0.5 NormalAttack1-->NormalAttack3,结…

什么是Immutable.js?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Flask-SQLAlchemy事件钩子介绍

一、前言 前几天在搜资料的时候无意中看到有介绍SQLAlchemy触发器&#xff0c;当时感觉挺奇怪的&#xff0c;触发器不是数据库层面的概念吗&#xff0c;怎么flask-SQLAlchemy这个ORM框架会有这玩意。 二、SQLAlchemy触发器一个简单例子 考虑到效率博客表中有两个字段&#xf…

【设计模式】第15节:行为型模式之“职责链模式”

一、简介 职责链模式&#xff1a;将请求的发送和接收解耦&#xff0c;让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链&#xff0c;并沿着这条链传递这个请求&#xff0c;直到链上的某个接收对象能够处理它为止。 二、优点 分离发送者和接受者易于扩展和维护…

SIT1028Q内置高压 LDO 本地互联网络(LIN)收发器

SIT1028Q 是一款内部集成高压 LDO 稳压源的本地互联网络&#xff08; LIN &#xff09;物理层收发器&#xff0c;可为外 部 ECU &#xff08; Electronic Control Unit &#xff09;微控制器或相关外设提供稳定的 5V/3.3V 电源&#xff0c;该 LIN 收发器 符合 LIN 2…

如何构建 :毫末波 与 RIS 研究系统

入门系统 USRP 上下变频器 喇叭天线 可联系博主系统的具体情况&#xff1b; 系统详情 首先需要在USRP上运行一个通信系统&#xff0c;这个系统可以是简单的文本传输系统&#xff0c;用Simulink搭建一下就行了。更加复杂的系统可以用LabVIEW或者Simulink来搭建&#xff1b;…

力扣第968题 监控二叉树 c++ hard题 二叉树的后序遍历 + 模拟 + 贪心

题目 968. 监控二叉树 困难 相关标签 树 深度优先搜索 动态规划 二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; …

Linux解决nvcc -V出现的-bash: nvcc command not found问题

两种解决办法&#xff1a; 1、第一种直接在bashrc文件中添加本地cuda路径&#xff1a; vim ~/.bashrc 定位到内容末尾&#xff0c;最末尾 添加命令&#xff1a; export LD_LIBRARY_PATH/usr/local/cuda/lib export PATH$PATH:/usr/local/cuda/bin添加后激活 source ~/.bashrc…

Java通过工具类判断前端给定的实体类属性中是否为空

目录 一、场景描述 二、实现过程 1、实体类 2、工具类 3、常量类 4、测试 一、场景描述 在Java开发过程中&#xff0c;当前端页面传递参数时&#xff0c;如果我们使用实体类进行接收&#xff0c;而一些属性的值是必须有值的&#xff0c;那么就需要对这些属性进行校验&…