主页 > 互联网  > 

Golang学习笔记_34——组合模式

Golang学习笔记_34——组合模式

Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 Golang学习笔记_33——桥接模式


文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 文件系统2. 图形界面3. 组织架构 四、代码示例(Go语言)五、高级应用1. 递归统计2. 组合模式 + 访问者模式 六、与其他模式对比七、总结


一、核心概念 1. 定义

组合模式(Composite Pattern)是一种结构型设计模式,通过将对象组织成树形结构来表示“部分-整体”的层次关系,使客户端可以统一处理单个对象和组合对象。

2. 解决的问题 树形结构表示:需要处理具有层级关系的对象(如文件系统、组织架构)统一操作接口:消除客户端对叶子节点和组合节点的差异感知递归遍历需求:需要递归处理嵌套结构(如计算文件夹总大小) 3. 核心角色

Component(抽象组件) 定义所有对象的通用接口,声明管理子组件的方法(如Add()、Remove())和业务方法(如Display())

Leaf(叶子节点) 树形结构的末端节点,没有子节点,实现具体业务逻辑

Composite(组合节点) 包含子节点的容器,实现组件接口并管理子组件集合

4. 类图

二、特点分析

优点

统一接口 客户端无需区分叶子节点和组合节点,简化调用逻辑

灵活扩展 新增组件类型无需修改现有代码,符合开闭原则

层次清晰 天然支持树形结构表示,便于处理递归操作

缺点

设计复杂度高 需要定义抽象接口并处理递归逻辑,增加实现难度

类型限制困难 难以约束容器节点只能包含特定类型子组件

三、适用场景 1. 文件系统 叶子节点:文件组合节点:文件夹(可包含文件/子文件夹)操作:递归计算总大小、展示目录结构 2. 图形界面 叶子节点:按钮、文本框组合节点:面板、窗口操作:统一渲染、事件处理 3. 组织架构 叶子节点:员工组合节点:部门操作:统计总人数、打印层级关系 四、代码示例(Go语言) package compositedemo import "fmt" // Component 接口 type Component interface { Display(indent string) } // Leaf 叶子节点 type File struct { Name string } func (l *File) Display(indent string) { println(indent + l.Name) } // Directory 组合节点 type Directory struct { Name string Component []Component } func (c *Directory) Display(indent string) { println(indent + c.Name) for _, component := range c.Component { component.Display(indent + indent) } } func (c *Directory) Add(component Component) { c.Component = append(c.Component, component) } func (c *Directory) Remove(component Component) { for i, v := range c.Component { if v == component { c.Component = append(c.Component[:i], c.Component[i+1:]...) } } } func test() { root := &Directory{Name: "root"} directory := &Directory{Name: "directory"} file1 := &File{Name: "file1"} file2 := &File{Name: "file2"} root.Add(directory) directory.Add(file1) directory.Add(file2) root.Display("--") fmt.Println("==========================================") directory.Display("**") } === RUN Test_test --root ----directory --------file1 --------file2 ========================================== **directory ****file1 ****file2 --- PASS: Test_test (0.00s) PASS 五、高级应用 1. 递归统计 // 在Component接口添加方法 type FileSystemComponent interface { Size() int } // File实现 func (f *File) Size() int { return 1024 // 假设固定大小 } // Directory实现 func (d *Directory) Size() int { total := 0 for _, child := range d.children { total += child.Size() } return total } 2. 组合模式 + 访问者模式

通过访问者模式实现更复杂的树形结构操作(如格式转换、权限检查)

六、与其他模式对比 模式核心目标关键区别装饰器动态添加功能通过嵌套包装扩展功能适配器接口转换解决接口不兼容问题迭代器遍历集合元素专注于遍历算法实现 七、总结

组合模式通过树形结构和统一接口,有效解决了以下问题:

层次结构表示:天然适合文件系统、组织架构等场景递归操作简化:通过统一接口实现递归遍历扩展性提升:新增组件类型不影响现有结构

在Go语言中实现时需注意:

通过接口实现多态特性使用切片管理子组件集合谨慎处理叶子节点的无效方法(如Add())
标签:

Golang学习笔记_34——组合模式由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Golang学习笔记_34——组合模式