【设计模式】10、composite 组合模式

ops/2025/1/16 1:03:05/

文章目录

  • 十、composite 组合模式
    • 10.1 search_in_file_folder
      • 10.1.1 inode_test.go
      • 10.1.2 inode.go
      • 10.1.3 file.go
      • 10.1.4 folder.go

十、composite 组合模式

https://refactoringguru.cn/design-patterns/composite

树状结构, 适合用组合模式, 不断递归, 对各子节点求和, 直到叶子节点为止.

例如, 一个大盒子, 内可以放置物体, 或若干小盒子. 而每个小盒子又同理.

10.1 search_in_file_folder

https://refactoringguru.cn/design-patterns/composite/go/example

希望在一个目录中搜索文件名

目录中有子目录和文件, 这是一个树状结构, 需要递归计算

10composite/101search_in_file_folder
├── file.go
├── folder.go
├── inode.go
├── inode_test.go
└── readme.md

10.1.1 inode_test.go

package _01search_in_file_folderimport ("github.com/stretchr/testify/require""testing"
)func TestExistInTree(t *testing.T) {f1 := &file{name: "f1"}f2 := &file{name: "f2"}f3 := &file{name: "f3"}d1 := &folder{name: "d1", children: []iNode{f1, f2}}d2 := &folder{name: "d2", children: []iNode{f3}}d := &folder{name: "d3", children: []iNode{d1, d2}}require.True(t, d.ExistInTree("f1"))require.True(t, d.ExistInTree("f2"))require.True(t, d.ExistInTree("f3"))require.True(t, d.ExistInTree("d1"))require.True(t, d.ExistInTree("d2"))require.True(t, d.ExistInTree("d3"))require.False(t, d.ExistInTree("a"))require.False(t, d.ExistInTree(""))
}

10.1.2 inode.go

package _01search_in_file_foldertype iNode interface {Name() stringExistInTree(query string) bool
}

10.1.3 file.go

package _01search_in_file_foldertype file struct {name string
}func (f *file) Name() string {return f.name
}func (f *file) ExistInTree(query string) bool {return f.Name() == query
}

10.1.4 folder.go

package _01search_in_file_foldertype folder struct {name     stringchildren []iNode
}func (f *folder) Name() string {return f.name
}func (f *folder) ExistInTree(query string) bool {if f.Name() == query {return true}for _, child := range f.children {exist := child.ExistInTree(query)if exist {return true}}return false
}

http://www.ppmy.cn/ops/15522.html

相关文章

记内网http洪水攻击,导致网页无法访问一事

事由 最近两日,部分同事在访问税纪云平台时,登录跳转页面频繁转圈、要么就是出现无法连接的错误提示。 无法访问此页面 已重置连接。 请尝试: 检查连接检查代理和防火墙运行 Windows 网络诊断经过以下几方面的排查,无果。 后续通过检查…

C++修炼之路之STL_priority_queue优先级队列和仿函数

目录 引言: 一:priority_queue的介绍 二:了解堆结构及对应的各种对应操作 三:priority_queue的接口函数及使用 1.接口函数 2.使用 四:仿函数operator() 五:用仿函数加容器适配器模拟实现priorit…

基础算法前缀和与差分

前言 本次博客会介绍一维和二维的前缀和,以及一维二维差分的基本使用,尽量画图,多使用配合文字 使大家理解,希望有所帮助吧 一维前缀和 问题描述 这里有一个长度为n的数组,我们要算出【2,5】区间的元素和 暴力思…

GO 的 Web 开发系列(八)—— Gin 自定义 Html 渲染实现多租户的模板设计

本文主要解决在多租户场景下的模板渲染问题。 正常情况下 Gin 配置的所有模板都属于同一个模板组合,相同名称的模板将相互覆盖。在未通过 define 指定模板名称时,同名模板文件也将相互覆盖。自定义函数中也无法区分租户,这将非常不方便我们进行多租户的模板渲染处理。通过自…

ProtoBuf、Grpc、GORM、Go-redis 入门基础

一、ProtoBuf、Grpc ProtoBuf定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 说白了,可以将ProtoBuf文件 当作支持语言的代码交换工具 Grpc…

【前端】vue数组去重的3种方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数组去重说明二、Vue数组去重的3种方法 前言 随着开发语言及人工智能工具的普及,使得越来越多的人会主动学习使用一些开发工具,本文…

对观察者模式的理解

目录 一、场景1、题目描述 【[案例来源](https://kamacoder.com/problempage.php?pid1075)】2、输入描述3、输出描述4、输入示例5、输出示例 二、实现三、更复杂的场景 【[案例来源](https://refactoringguru.cn/design-patterns/observer/java/example#example-0--listeners-…

时间默认显示当前日期及系统时间

要将 xtdsSj 绑定到当前日期和系统时间&#xff0c;你可以在组件的 data 中初始化 xtdsSj 属性为当前日期及系统时间的字符串。然后&#xff0c;在组件创建时更新 xtdsSj&#xff0c;确保它始终显示当前日期和系统时间。 1.系统读数时间默认显示当前日期及系统时间 <templa…