GO 组合模式(Composite Pattern)
1. 组件 (Component) 接口描述了树中简单项目和复杂项目所共有的操作。
2. 叶节点 (Leaf) 是树的基本结构, 它不包含子项目。
一般情况下, 叶节点最终会完成大部分的实际工作, 因为它们无法将工作指派给其他部分。
3. 容器 (Container)——又名 “组合 (Composite)”——是包含叶节点或其他容器等子项目的单位。
容器不知道其子项目所属的具体类, 它只通过通用的组件接口与其子项目交互。
容器接收到请求后会将工作分配给自己的子项目, 处理中间结果, 然后将最终结果返回给客户端。
4. 客户端 (Client) 通过组件接口与所有项目交互。 因此, 客户端能以相同方式与树状结构中的简单或复杂项目交互。
组合模式适合应用场景
1. 如果你需要实现树状对象结构, 可以使用组合模式。
2. 组合模式为你提供了两种共享公共接口的基本元素类型: 简单叶节点和复杂容器。 容器中可以包含叶节点和其他容器。 这使得你可以构建树状嵌套递归对象结构。
3. 如果你希望客户端代码以相同方式处理简单和复杂元素, 可以使用该模式。
4. 组合模式中定义的所有元素共用同一个接口。 在这一接口的帮助下, 客户端不必在意其所使用的对象的具体类。
组合模式优缺点
优点:
1. 你可以利用多态和递归机制更方便地使用复杂树结构。
2. 开闭原则。 无需更改现有代码, 你就可以在应用中添加新元素, 使其成为对象树的一部分。
缺点:
1. 对于功能差异较大的类, 提供公共接口或许会有困难。 在特定情况下, 你需要过度一般化组件接口, 使其变得令人难以理解。
DEMO
package main
import (
"fmt"
"strconv"
)
type ICorporation interface {
Count() int64
}
type Corporation struct {
Id int64
Name string
ChildCorporation []ICorporation
}
func (c *Corporation) Count() int64 {
var count int64
for _, corp := range c.ChildCorporation {
count += corp.Count()
}
return count
}
func (c *Corporation) Add(child ICorporation) {
c.ChildCorporation = append(c.ChildCorporation, child)
}
type Staff struct {
Id int64
Name string
}
func (s *Staff) Count() int64 {
return 1
}
func NewCorporation() ICorporation {
root := &Corporation{
Id: 1,
Name: "root",
ChildCorporation: nil,
}
for i := 0; i < 10; i++ {
root.Add(&Staff{
Id: int64(i),
Name: "staff_" + strconv.Itoa(i),
})
root.Add(&Corporation{Id: int64(i)*100, Name: "sub_" + strconv.Itoa(i), ChildCorporation: nil})
}
return root
}
func main() {
c := NewCorporation()
fmt.Println(c.Count())
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具