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

一、简介

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

二、 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.mfbz.cn/a/113004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scan2BIM实战:从3D扫描到BIM模型生成

最近&#xff0c;我被问过很多次这个问题&#xff0c;所以我想我会尽力传达答案。 我应该指出&#xff0c;以下是概述&#xff0c;而不是非常详细的分步过程。 有很多因素会决定这项工作&#xff1b; 详细程度、扫描设备、点云配准软件和 CAD 软件等。 由于不知道你可能拥有或感…

分享一下微信小程序里怎么开店

如何在微信小程序中成功开店&#xff1a;从选品到运营的全方位指南 一、引言 随着微信小程序的日益普及&#xff0c;越来越多的人开始尝试在微信小程序中开设自己的店铺。微信小程序具有便捷、易用、即用即走等特点&#xff0c;使得开店门槛大大降低。本文将详细介绍如何在微…

中考倒计时7个月复习攻略:名师支招,为“长跑”积蓄能量

今天是2023年11月2日&#xff0c;距离2024年中考还有7个月多一点的时间。其实据六分成长了解&#xff0c;很多学校到了初三&#xff08;九年级&#xff09;基本上都是奔着中考考试复习的&#xff0c;这一学年基本上是长跑、拉力赛&#xff0c;拼的不只是智力&#xff0c;还有体…

记一次大数据事故@用了很久的虚拟机环境突然不能联网了

记一次大数据事故用了很久的虚拟机环境突然不能联网了 背景 今天打开自己电脑上的虚拟机环境打算练习一下flink&#xff0c;结果发现vmware里虚拟机能正常开机&#xff0c;也能正常进图os&#xff0c;但是就是不能ping通主机&#xff0c;主机也不能ping通虚拟机 探查 1、…

猫耳 Android 播放框架开发实践

概述 猫耳FM是中国最大的 95 后声音内容分享平台&#xff0c;是B站重要平台之一&#xff0c;深度合作国内顶级声优工作室&#xff0c;打造了数百部精品广播剧&#xff0c;全站播放总量超过百亿次。 MEPlayer 是猫耳 Android 技术团队研发的一款适用于音视频、直播、特效播放等…

处理大数据的基础架构,OLTP和OLAP的区别,数据库与Hadoop、Spark、Hive和Flink大数据技术

处理大数据的基础架构&#xff0c;OLTP和OLAP的区别&#xff0c;数据库与Hadoop、Spark、Hive和Flink大数据技术 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&am…

数据链路层中存在的报文ip,arp,rarp

IP数据报 ARP请求/应答报 RARP请求/应答报 IP数据报 这里的目的地址和源地址是MAC地址。 这个被称为 MAC 地址&#xff0c;是一个网卡的物理地址&#xff0c;用十六进制&#xff0c;6 个 byte 表示。 MAC 地址是一个很容易让人误解的地址。因为 MAC 地址号称全球唯一&…

如何选择合适的千兆或万兆光模块

随着数字化转型的加快和云计算、物联网等技术的迅猛发展&#xff0c;对高带宽和高速度通信的需求将持续增长。光模块作为实现高速光纤通信的关键组件&#xff0c;在数据中心、通信网络、云服务等领域得到更广泛的应用。对于用户来说&#xff0c;如何选择适合自己应用的光模块是…

Vue elemen ui 移除上次校验与部分清除上次校验

场景&#xff1a; 可以切换类型&#xff0c;下面的输入框参数也会随着改变。 如果不清除上次的校验就会出现&#xff0c;之前的大陆企业的校验还会出现在香港企业的校验中 方法&#xff1a; watch:{ruleForm.paymentSubjectType:{ 通过监听表单的类型来调用 clearValidate方…

LV.12 D13 UART实验 学习笔记

一、UART帧格式详解 UART Universal Asynchronous Receiver Transmitter 即 通用异步收发器&#xff0c;是一种通用的串行、异步通信总线 该总线有两条数据线&#xff0c;可以实现全双工的发送和接收&#xff0c;在嵌入式系统中常用于主机与辅助设备之间的通信。 通…

API文档自动生成

API文档自动生成 背景smart-doc配置效果图 背景 对于API接口文档自动生成&#xff0c;可能大家&#xff0c;最新想到的是用swagger&#xff0c;但是有以下问题&#xff1a; 对代码侵入太强版本升级&#xff0c;并不兼容不能生成各种类型的文档 所以&#xff0c;今天给大家推荐…

Python Django 之模板继承详解(extends)

文章目录 1 概述1.1 目的1.2 标签&#xff1a;block、extends1.3 目录结构 2 templates 目录2.1 base.html&#xff1a;父页面2.2 login.html&#xff1a;子页面 3 其它代码3.1 settings.py3.2 views.py3.3 urls.py 1 概述 1.1 目的 模板继承 和 类继承 的目的是一样的&#…

【已解决】PPT不能转换成PDF文档怎么办?

PPT可以转换成PDF文档&#xff0c;只需要点击PPT菜单页面中的【文件】选项&#xff0c;再点击【导出】即可转换&#xff0c;如果转换时发现【导出】选项不可选&#xff0c;无法完成转换怎么办&#xff1f;以下3种方法可以试试&#xff01; 出现上面这种情况&#xff0c;我们可以…

HWebkit库的程序示例

HWebkit库的爬虫程序&#xff0c;并且能够使用指定的服务器。以下是代码的每一行的中文解释&#xff1a; import HWebkit import Network.HTTP.Client import Network.HTTP.Client.TLS import Data.Text.Encoding ​ -- 创建服务器的连接&#xff0c;使用的端口和主机是 proxy…

计算机服务器中了mallad勒索病毒怎么办,勒索病毒解密恢复

警惕&#xff0c;警惕&#xff0c;企业主多警惕&#xff0c;新型网络勒索病毒出来了&#xff0c;近期&#xff0c;云天数据恢复中心&#xff0c;接到了某企业的求助&#xff0c;企业的计算机服务器中了mallad后缀勒索病毒&#xff0c;导致企业计算机系统瘫痪&#xff0c;无法正…

Vue3.0 reactive与ref :VCA模式

简介 Vue3 最大的一个变动应该就是推出了 CompositionAPI&#xff0c;可以说它受ReactHook 启发而来&#xff1b;它我们编写逻辑更灵活&#xff0c;便于提取公共逻辑&#xff0c;代码的复用率得到了提高&#xff0c;也不用再使用 mixin 担心命名冲突的问题。 ref 与 reactive…

yolov7模型轻量化改进之MobileOne骨干替换

本文在之前文章yolov7分割训练的基础上进行改进: https://blog.csdn.net/qq_41920323/article/details/129464115?spm=1001.2014.3001.5502 具体GitHub工程下载,环境安装配置,数据准备等,请借鉴之前的文章,此处只介绍如何进行改进。 MobileOne地址:https://github.com…

通付盾Web3专题 | 智能账户:数字时代基础单元

2008年10月31日&#xff0c;中本聪&#xff08;Satoshi Nakamoto&#xff09;在P2P foundation 网站发布比特币白皮书《比特币&#xff1a;一种点对点的电子现金系统》。转眼距比特币白皮书发布已过去15年。2009年1月比特币网络正式推出&#xff0c;当时每个比特币的价格仅为0.…

设置防火墙

1.RHEL7中的防火墙类型 防火墙只能同时使用一张,firewall底层调用的还是lptables的服务: firewalld:默认 &#xff0c;基于不同的区域做规则 iptables: RHEL6使用&#xff0c;基于链表 Ip6tables Ebtables 2.防火墙的配置方式 查看防火墙状态: rootlinuxidc -]#systemct…

idea集成测试插件替代postman

idea集成测试插件替代postman 兄弟萌&#xff0c;你再测试接口是否无bug是否流畅的时候是否还在使用“postman”来回切换进行测试呢&#xff1f; 页面切换进行测试&#xff0c;有没有感觉很麻烦呢&#xff1f; 打开postman&#xff0c;输入接口地址&#xff0c;有没有感觉很麻烦…