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

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


文章目录


一、核心概念

1. 定义

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

2. 解决的问题

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

3. 核心角色

  1. Component(抽象组件)

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

  2. Leaf(叶子节点)

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

  3. Composite(组合节点)

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

4. 类图


二、特点分析

优点

  1. 统一接口

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

  2. 灵活扩展

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

  3. 层次清晰

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

缺点

  1. 设计复杂度高

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

  2. 类型限制困难

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

三、适用场景

1. 文件系统

  • 叶子节点:文件
  • 组合节点:文件夹(可包含文件/子文件夹)
  • 操作:递归计算总大小、展示目录结构

2. 图形界面

  • 叶子节点:按钮、文本框
  • 组合节点:面板、窗口
  • 操作:统一渲染、事件处理

3. 组织架构

  • 叶子节点:员工
  • 组合节点:部门
  • 操作:统计总人数、打印层级关系

四、代码示例(Go语言)

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. 递归统计

go 复制代码
// 在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. 组合模式 + 访问者模式

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

六、与其他模式对比

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

七、总结

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

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

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

  • 通过接口实现多态特性
  • 使用切片管理子组件集合
  • 谨慎处理叶子节点的无效方法(如Add()
相关推荐
ByNotD0g几秒前
Golang开发项目学习
学习·微服务·云原生·golang
沐雨风栉几秒前
被局域网困住的文件?cpolar让 Go File 随时随地能用
运维·服务器·开发语言·数据库·后端·缓存·golang
智元视界7 分钟前
从深度学习到自主学习:AI的下一个技术跃迁
大数据·人工智能·深度学习·学习·架构·数字化转型·产业升级
君鼎12 分钟前
计算机网络第二章:物理层学习总结
网络·学习·计算机网络
卿雪20 分钟前
MySQL【基础】篇:什么是MySQL、主键和外键、三大范式、DDL、DML、DDL、DCL...
java·服务器·开发语言·数据库·后端·mysql·golang
小小的代码里面挖呀挖呀挖22 分钟前
杰理蓝牙耳机开发 -- 单线级联RGB幻彩灯控制
笔记·单片机·物联网·学习·iot
@游子27 分钟前
Python学习笔记-Day4
笔记·python·学习
.小小陈.39 分钟前
C++初阶4:STL简介
开发语言·c++·学习
FFF团团员90940 分钟前
树莓派学习笔记5:安装yagmail,启用SMTP,发送邮件
笔记·学习
Francek Chen1 小时前
Francek Chen 的730天创作纪念日
大数据·人工智能·学习·程序人生·创作纪念日