做网站的流程方法,深圳企业公司有哪些,广州建筑股份有限公司官网,兰州关键词优化排名Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 Golang学习笔记_33——桥接模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 文件系统2. 图形界面3. 组织架构 四、代码示例#xff08;Go语言#xff09;五、…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[i1:]...)}}
}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()