Go通过接口+嵌入实现组合模式,统一Component接口使叶子(File)与容器(Folder)透明递归处理:File仅存数据并返回错误,Folder聚合子节点并委托操作,支持异构节点混合与自动遍历聚合。

用 Go 实现组合节点树形结构,核心是让“单个对象”和“复合对象”对外提供统一接口,从而透明地递归处理整棵树。Golang 没有继承,但通过接口 + 嵌入(embedding)+ 方法集,能优雅实现 Composite Pattern。
所有节点(叶子或容器)都实现同一个接口,比如 Component:
type Component interface {
GetName() string
GetSize() int64
Print(indent string)
Add(Component) error // 可选:仅容器需支持,叶子可返回错误
}这个接口暴露了树遍历和聚合所需的基本能力。注意:Add 方法不是所有节点都必须支持——叶子节点可直接返回 errors.New("leaf node cannot add children"),保持语义清晰。
叶子只持有自身数据,不包含子节点:
立即学习“go语言免费学习笔记(深入)”;
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)
}
func (f *File) Add(_ Component) error {
return errors.New("cannot add to file")
}文件夹(Folder)持有子组件切片,把操作委托给子项,并聚合结果:
type Folder struct {
name string
children []Component
}
func (f *Folder) GetName() string { return f.name }
func (f *Folder) GetSize() int64 {
var total int64
for _, c := range f.children {
total += c.GetSize()
}
return total
}
func (f *Folder) Print(indent string) {
fmt.Printf("%s? %s (total: %d bytes)\n", indent, f.name, f.GetSize())
for _, c := range f.children {
c.Print(indent + " ")
}
}
func (f *Folder) Add(c Component) error {
f.children = append(f.children, c)
return nil
}关键点:Folder 不暴露 children 字段,也不要求子节点类型一致——只要实现了 Component 接口,就能加入树中,天然支持异构节点(如混合 File、ZipArchive、RemoteResource 等)。
组合一棵简单目录树:
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: "README.md", size: 2048})
root.Print("") // 自动递归打印整棵树
fmt.Printf("Total size: %d\n", root.GetSize()) // 自动聚合无需判断类型、无 switch 分支、无重复遍历逻辑——所有递归和聚合都由接口契约驱动。
基本上就这些。Go 的接口和组合机制让 Composite Pattern 不依赖继承也能自然落地,重点在于提前想清楚哪些行为需要统一抽象(如 Print/GetSize),再让 Leaf 和 Composite 各自专注实现——一个存数据,一个管调度。
以上就是如何使用Golang实现组合节点树形处理_使用Composite Pattern管理层级的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号