全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现组合模式_使用Composite Pattern处理树形结构

Go实现组合模式的关键是让叶子和容器节点实现统一Node接口,通过接口+嵌入+方法集表达层次关系;File实现基础行为,Folder聚合Node切片并委托操作,Add方法仅限组合节点,调用方无需类型判断即可统一处理树结构。

用 Go 实现组合模式(Composite Pattern)的关键在于:让叶子节点和容器节点实现同一接口,从而能统一处理树形结构中的任意节点,无需区分“有没有子节点”。Go 没有继承,但靠接口 + 嵌入(embedding)+ 方法集,能干净地表达“整体-部分”的层次关系。

定义统一的 Component 接口

所有节点——无论是文件(叶子)还是文件夹(容器)——都实现同一个接口,比如 Node

(接口只声明行为,不关心具体是叶子还是组合)

type Node interface {
    GetName() string
    GetSize() int64
    Print(indent string)
}

这个接口覆盖了树遍历、统计、展示等常见需求。只要类型实现了这三个方法,它就是合法的树节点。

实现叶子节点(Leaf)

比如一个普通文件,它没有子节点,GetSize() 返回自身大小,Print() 不递归:

type File struct {
    name string
    size int64
}

func (f *File) GetName() string { return f.name }
func (f *File) GetSize() int64  { return f.size }
func (f *File) Print(indent string) {
    fmt.Printf("%s? %s (%d bytes)\n", indent, f.name, f.size)
}

实现组合节点(Composite)

比如文件夹,它持有子节点切片,并把操作委托给子节点:

type Folder struct {
    name     string
    children []Node // 关键:存的是接口,可混装 File 和 Folder
}

func (f *Folder) GetName() string { return f.name }
func (f *Folder) GetSize() int64 {
    var total int64
    for _, child := range f.children {
        total += child.GetSize()
    }
    return total
}
func (f *Folder) Print(indent string) {
    fmt.Printf("%s? %s\n", indent, f.name)
    for _, child := range f.children {
        child.Print(indent + "  ") // 向下缩进,递归打印
    }
}
func (f *Folder) Add(child Node) {
    f.children = append(f.children, child)
}

注意:Add 是组合节点特有方法,不必塞进 Node 接口——组合模式不要求所有方法对称,只保证公共行为一致。

构建与使用树结构

你可以自由嵌套,代码清晰直观:

root := &Folder{name: "project"}
src := &Folder{name: "src"}
src.Add(&File{name: "main.go", size: 1024})
src.Add(&File{name: "utils.go", size: 512})

root.Add(src)
root.Add(&File{name: "go.mod", size: 128})

fmt.Println("Tree size:", root.GetSize()) // → 1664
root.Print("") // 自动缩进打印整棵树

调用方完全不用判断 if folder != nilif file != nil ——所有节点都当 Node 处理,递归逻辑收在 PrintGetSize 内部。

基本上就这些。Go 的组合模式不依赖类继承,靠接口契约 + 值/指针接收者 + 切片存接口,轻量又灵活。关键不是“模仿 Java 写法”,而是抓住“统一操作入口”这个本质。


# java  # node  # go  # golang  # app  # ai 


相关文章: 如何用免费手机建站系统零基础打造专业网站?  如何在建站之星网店版论坛获取技术支持?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  如何撰写建站申请书?关键要点有哪些?  b2c电商网站制作流程,b2c水平综合的电商平台?  如何实现建站之星域名转发设置?  网站制作免费,什么网站能看正片电影?  如何选择高效稳定的ISP建站解决方案?  如何零成本快速生成个人自助网站?  制作证书网站有哪些,全国城建培训中心证书查询官网?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  北京专业网站制作设计师招聘,北京白云观官方网站?  建站之星图片链接生成指南:自助建站与智能设计教程  C++如何编写函数模板?(泛型编程入门)  建站之星备案是否影响网站上线时间?  浅谈Javascript中的Label语句  临沂网站制作公司有哪些,临沂第四中学官网?  建站之星如何实现网站加密操作?  如何续费美橙建站之星域名及服务?  网站app免费制作软件,能免费看各大网站视频的手机app?  南平网站制作公司,2025年南平市事业单位报名时间?  如何选择高性价比服务器搭建个人网站?  如何通过二级域名建站提升品牌影响力?  如何设计高效校园网站?  宝塔面板如何快速创建新站点?  如何安全更换建站之星模板并保留数据?  如何在阿里云通过域名搭建网站?  建站之星价格显示格式升级,你的预算足够吗?  如何用花生壳三步快速搭建专属网站?  linux top下的 minerd 木马清除方法  建站之星logo尺寸如何设置最合适?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  成都网站制作报价公司,成都工业用气开户费用?  如何通过虚拟机搭建网站?详细步骤解析  英语简历制作免费网站推荐,如何将简历翻译成英文?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  定制建站是什么?如何实现个性化需求?  如何快速辨别茅台真假?关键步骤解析  ,sp开头的版面叫什么?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何用搬瓦工VPS快速搭建个人网站?  如何通过可视化优化提升建站效果?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  想学网站制作怎么学,建立一个网站要花费多少? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。