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

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

一、简介

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

二、 UML类图

请添加图片描述

三、案例

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

package main
import "fmt"type FileSystemNode interface {CountNumOfFiles() int64GetPath() 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 stringsubNodes []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 = pathreturn directory
}func NewFile(path string) *File {file := new(File)file.path = pathreturn 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())
}

相关文章:

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

一、简介 组合模式&#xff1a;将一组对象组织成树形结构&#xff0c;将单个对象和组合对象都看做树中的节点&#xff0c;以统一处理逻辑&#xff0c;并且它利用树形结构的特点&#xff0c;递归地处理每个子树&#xff0c;依次简化代码实现。使用组合模式的前提在于&#xff0…...

改进YOLOv3!IA-YOLO:恶劣天气下的目标检测

恶劣天气条件下从低质量图像中定位目标还是极具挑战性的任务。现有的方法要么难以平衡图像增强和目标检测任务&#xff0c;要么往往忽略有利于检测的潜在信息。本文提出了一种新的图像自适应YOLO (IA-YOLO)框架&#xff0c;可以对每张图像进行自适应增强&#xff0c;以提高检测…...

Vue路由跳转的几种方式

1.this. $router.push( ) 跳转到指定的URL&#xff0c;在history栈中添加一个记录&#xff0c;点击后退会返回上一个页面。 1. 不带参数// 字符串this.$router.push(/home)this.$router.push(/home/first)// 对象this.$router.push({path:/home})this.$router.push({ path: /…...

TiDB x 汉口银行丨分布式数据库应用实践

汉口银行是一家城市商业银行&#xff0c;近年来专注科技金融、民生金融等领域。在数据库国产化改造中&#xff0c;汉口银行引入了 TiDB 数据库&#xff0c;并将其应用在重要业务系统&#xff1a;头寸系统中&#xff0c;实现了一栈式的数据服务&#xff0c;同时满足了高并发、低…...

uci机器学习数据库简介

UCI&#xff08;University of California, Irvine&#xff09;机器学习数据库是经过精心整理的、用于研究和开发机器学习算法的数据集合。UCI机器学习数据库是一个公开的、广泛使用的数据集合&#xff0c;它由加州大学欧文分校的计算机科学系维护。该数据库中包含了许多数据集…...

多人协作使用git如何解决冲突?

什么情况会产生冲突 git merge XXX(合并分支时的冲突)&#xff1a; 当你尝试将一个分支的更改合并到另一个分支时&#xff0c;如果两个分支都修改了相同的文件的相同部分&#xff0c;Git 将无法自动解决冲突&#xff0c;因此会发生冲突。你需要手动解决这些冲突&#xff0c;然后…...

基于【逻辑回归】的评分卡模型金融借贷风控项目实战

背景知识&#xff1a; 在银行借贷过程中&#xff0c;评分卡是一种以分数形式来衡量一个客户的信用风险大小的手段。今天我们来复现一个评分A卡的模型。完整的模型开发所需流程包括&#xff1a;获取数据&#xff0c;数据清洗和特征工程&#xff0c;模型开发&#xff0c…...

企业拉美跨境出海面对时延情况怎么办?

随着全球化不断发展&#xff0c;中国企业也不断向海外拓展业务&#xff0c;开拓市场&#xff0c;增加收入来源&#xff0c;扩大自身品牌影响力。然而出海企业面临不同以往的困难和挑战&#xff0c;在其中不可避免面临的跨境网络时延问题&#xff0c;如何选择区域进行部署企业业…...

【vector题解】只出现一次的数字 | 电话号码的数字组合

只出现一次的数字 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并…...

VS2022 开发方式

使用 C# 在VS 2022 上开发时&#xff0c;发现有多种项目类型可以创建。这些类型放一起容易搞混&#xff0c;于是记录一下各种类型的区别。 这里主要介绍windows控制台程序、MFC程序、WPF程序、WinForm程序的特点。 创建哪种应用&#xff1f; 创建控制台应用 Windows控制台程序…...

【Python语言速回顾】——数据可视化基础

目录 引入 一、Matplotlib模块&#xff08;常用&#xff09; 1、绘图流程&常用图 ​编辑 2、绘制子图&添加标注 ​编辑 3、面向对象画图 4、Pylab模块应用 二、Seaborn模块&#xff08;常用&#xff09; 1、常用图 2、代码示例 ​编辑 ​编辑 ​编辑 ​…...

java实现pdf文件添加水印,下载到浏览器

java实现pdf文件添加水印&#xff0c;下载到浏览器 添加itextpdf依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.8</version> </dependency>文件下载到浏览器和指定路径 …...

代码随想录算法训练营第四十一天丨 动态规划part04

01背包理论基础 见连接&#xff1a;代码随想录 416. 分割等和子集 思路 01背包问题 背包问题&#xff0c;大家都知道&#xff0c;有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解…...

PyCharm免费安装和新手使用教程

简介 PyCharm是一款由JetBrains公司开发的Python集成开发环境&#xff08;IDE&#xff09;。它提供了一系列强大的功能&#xff0c;包括自动代码完成、语法高亮、自动缩进、代码重构、调试器、测试工具、版本控制工具等&#xff0c;使开发者可以更加高效地开发Python应用程序。…...

使用Python的Scikit-Learn进行决策树建模和可视化:以隐形眼镜数据集为例

决策树是一种强大的机器学习算法&#xff0c;它在数据挖掘和模式识别中被广泛应用。决策树模型可以帮助我们理解数据中的模式和规则&#xff0c;并做出预测。在本文中&#xff0c;我们将介绍如何使用Python的Scikit-Learn库构建决策树模型&#xff0c;并使用Graphviz进行可视化…...

开源软件:释放创新的力量,改变数字世界的游戏规则

在充满活力的技术领域&#xff0c;创新是至高无上的&#xff0c;有一种方法已获得显著的吸引力——开源软件。开源软件凭借其透明、协作和无限可能性的精神&#xff0c;彻底改变了我们开发、共享和定制应用程序的方式。从操作系统到数据分析工具&#xff0c;其影响跨越了多个领…...

【QT】鼠标常用事件

新建项目 加标签控件 当鼠标进去&#xff0c;显示【鼠标进入】&#xff0c;离开时显示【鼠标离开】 将QLable提升成自己的控件&#xff0c;然后再去捕获 添加文件 改继承的类名 提升类 同一个父类&#xff0c;可以提升 效果 现在代码就和Qlabel对应起来了。 在.h中声明&…...

LuatOS-SOC接口文档(air780E)--mlx90640 - 红外测温(MLX90640)

常量# 常量 类型 解释 mlx90640.FPS1HZ number FPS1HZ mlx90640.FPS2HZ number FPS2HZ mlx90640.FPS4HZ number FPS4HZ mlx90640.FPS8HZ number FPS8HZ mlx90640.FPS16HZ number FPS16HZ mlx90640.FPS32HZ number FPS32HZ mlx90640.FPS64HZ number FPS6…...

java连接本地数据库可以简写为///

java连接数据库配置文件写为&#xff1a; server:port: 8091 spring:application:name: user-managerdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/user?serverTimezoneAsia/Shanghai&characterEncodingutf-8username: root…...

基于springboot漫画动漫网站

基于springbootvue漫画动漫网站 摘要 基于Spring Boot的漫画动漫网站是一个精彩的项目&#xff0c;它结合了现代Web开发技术和漫画爱好者的热情。这个网站的目标是为用户提供一个便捷的平台&#xff0c;让他们能够欣赏各种漫画和动漫作品&#xff0c;与其他爱好者分享他们的兴趣…...

Python实战:利用imageio与PIL打造高效图片转视频工具

1. 为什么需要图片转视频工具&#xff1f; 在日常工作和生活中&#xff0c;我们经常会遇到需要将多张图片合成为视频的场景。比如制作产品演示视频、创建旅行相册、生成数据可视化动画等。手动使用视频编辑软件处理这些需求不仅效率低下&#xff0c;而且难以实现批量自动化处理…...

Janus-Pro-7B多模态效果展示:基于Transformer架构的图像描述与问答

Janus-Pro-7B多模态效果展示&#xff1a;基于Transformer架构的图像描述与问答 最近在体验各种多模态大模型&#xff0c;发现了一个挺有意思的选手——Janus-Pro-7B。它主打一个能力&#xff1a;不仅能看懂图片&#xff0c;还能用文字把看到的东西描述出来&#xff0c;甚至能跟…...

5分钟掌握BepInEx:Unity游戏插件开发的终极框架指南

5分钟掌握BepInEx&#xff1a;Unity游戏插件开发的终极框架指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 如果你正在寻找一个强大、稳定且易于使用的Unity游戏插件开发框架&…...

正交编码器信号处理避坑指南:ESP32 PCNT模块的6个关键配置参数详解

正交编码器信号处理避坑指南&#xff1a;ESP32 PCNT模块的6个关键配置参数详解 在工业自动化和机器人控制系统中&#xff0c;正交编码器作为核心的位置反馈元件&#xff0c;其信号处理的可靠性直接决定了整个系统的精度。ESP32内置的PCNT&#xff08;Pulse Counter&#xff09;…...

Graphormer模型推理加速:利用.accelerate库优化计算性能

Graphormer模型推理加速&#xff1a;利用.accelerate库优化计算性能 1. 引言&#xff1a;为什么需要加速Graphormer推理 Graphormer作为图神经网络领域的重要突破&#xff0c;在分子属性预测、药物发现等任务中展现出强大能力。但随着分子库规模扩大&#xff0c;推理速度成为…...

DeOldify多用户并发测试:100+请求下服务稳定性与响应延迟实测

DeOldify多用户并发测试&#xff1a;100请求下服务稳定性与响应延迟实测 1. 引言&#xff1a;当AI上色服务遇到真实流量考验 想象一下&#xff0c;你搭建了一个很酷的AI图片上色服务&#xff0c;平时自己用着挺顺&#xff0c;处理一张老照片也就几秒钟。但突然有一天&#xf…...

实战指南:利用JPerf优化嵌入式网络性能测试

1. JPerf工具基础入门&#xff1a;从零开始网络性能测试 第一次接触嵌入式网络性能测试时&#xff0c;我被各种专业术语和复杂参数搞得晕头转向。直到发现了JPerf这个神器&#xff0c;才真正打开了网络调优的大门。JPerf实际上是iPerf的图形化版本&#xff0c;它把原本需要记忆…...

面向 LLM 的程序设计 4:API 版本化与演进——在「模型会记忆旧文档」前提下的兼容策略

用三句话先说明白 人会照旧说明书办事&#xff0c;模型也一样。 它见过的文档、缓存里的接口描述、网页上没刷新的说明、向量库里还没更新的片段&#xff0c;都可能比真实系统更旧。于是系统已经升级了&#xff0c;它还在用老地址、老字段名、老例子去调用。 给人改流程&#…...

基于Simulink的Smith预估器PID整定与延迟系统控制实验

1. 从零开始理解Smith预估控制 第一次接触Smith预估器时&#xff0c;我也被这个"时间旅行"般的概念惊艳到了。想象一下&#xff0c;你正在用热水器洗澡&#xff0c;每次调节水温都要等10秒才能感受到变化——这就是典型的纯延迟系统。Smith预估器的精妙之处在于&…...

从API调用到完整应用:手把手教你用Dashscope和Streamlit搭建一个多模态聊天机器人

从API调用到完整应用&#xff1a;手把手教你用Dashscope和Streamlit搭建多模态聊天机器人 在AI技术快速落地的今天&#xff0c;将强大的API能力转化为直观可用的产品已成为开发者的核心技能。想象一下&#xff0c;你只需要200行Python代码&#xff0c;就能构建一个能"看懂…...