网站服务器建设的三种方法成都广告牌制作厂家
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 compositedemoimport "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      stringComponent []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 := 0for _, child := range d.children {total += child.Size()}return total
}
 
2. 组合模式 + 访问者模式
通过访问者模式实现更复杂的树形结构操作(如格式转换、权限检查)
六、与其他模式对比
| 模式 | 核心目标 | 关键区别 | 
|---|---|---|
| 装饰器 | 动态添加功能 | 通过嵌套包装扩展功能 | 
| 适配器 | 接口转换 | 解决接口不兼容问题 | 
| 迭代器 | 遍历集合元素 | 专注于遍历算法实现 | 
七、总结
组合模式通过树形结构和统一接口,有效解决了以下问题:
- 层次结构表示:天然适合文件系统、组织架构等场景
 - 递归操作简化:通过统一接口实现递归遍历
 - 扩展性提升:新增组件类型不影响现有结构
 
在Go语言中实现时需注意:
- 通过接口实现多态特性
 - 使用切片管理子组件集合
 - 谨慎处理叶子节点的无效方法(如
Add()) 
