[go] 组合模式

组合模式

允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

模型说明

  • Component: 接口描述了树中简单项目和复杂项目所共有的操作。

  • Leaf: 是树的基本结构,它不包含子项目。

  • 一般情况下,叶节点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分。

  • Container: 又名 “组合 (Composite)”——是包含叶节点或其他容器等子项目的单位。容器不知道其子项目所属的具体类,它只通过通用的组件接口与其子项目交互。

  • 容器接收到请求后会将工作分配给自己的子项目,处理中间结果,然后将最终结果返回给客户端。

  • Client: 通过组件接口与所有项目交互。因此,客户端能以相同方式与树状结构中的简单或复杂项目交互。

优缺点

1.优点

  • 你可以利用多态和递归机制更方便地使用复杂树结构。
  • 开闭原则: 无需更改现有代码,你就可以在应用中添加新元素,使其成为对象树的一部分。

2.缺点

  • 对于功能差异较大的类,提供公共接口或许会有困难。在特定情况下,你需要过度一般化组件接口,使其变得令人难以理解。

使用场景

  • 如果你需要实现树状对象结构,可以使用组合模式。
  • 如果你希望客户端代码以相同方式处理简单和复杂元素,可以使用该模式。

参考代码

  • 用一个操作系统文件系统的例子来理解组合模式。
// component.go 组件接口
package main

type Component interface {
   
	search(string)
}
// folder.go 具体组件
package main

import "fmt"

type Folder struct {
   
	components []Component
	name       string
}

func (f *Folder) search(keyword string) {
   
	fmt.Printf("Serching recursively for keyword %s in folder %s\n", keyword, f.name)
	for _, composite := range f.components {
   
		composite.search(keyword)
	}
}

func (f *Folder) add(c Component) {
   
	f.components = append(f.components, c)
}
// file.go 叶子组件
package main

import "fmt"

type File struct {
   
	name string
}

func (f *File) search(keyword string) {
   
	fmt.Printf("Searching for keyword %s in file %s\n", keyword, f.name)
}

func (f *File) getName() string {
   
	return f.name
}
// main.go 客户端
package main

func main() {
   
	file1 := &File{
   name: "File1"}
	file2 := &File{
   name: "File2"}
	file3 := &File{
   name: "File3"}

	folder1 := &Folder{
   
		name: "Folder1",
	}

	folder1.add(file1)

	folder2 := &Folder{
   
		name: "Folder2",
	}
	folder2.add(file2)
	folder2.add(file3)
	folder2.add(folder1)

	folder2.search("rose")
}

output:

Serching recursively for keyword rose in folder Folder2
Searching for keyword rose in file File2
Searching for keyword rose in file File3
Serching recursively for keyword rose in folder Folder1
Searching for keyword rose in file File1

相关推荐

  1. [go] 组合模式

    2024-01-21 10:32:04       47 阅读
  2. go设计模式组合设计模式

    2024-01-21 10:32:04       33 阅读
  3. GO设计模式——10、组合模式(结构型)

    2024-01-21 10:32:04       51 阅读
  4. 【最佳实践】Go 组合模式对业务解耦

    2024-01-21 10:32:04       47 阅读
  5. 设计模式——组合模式

    2024-01-21 10:32:04       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-21 10:32:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-21 10:32:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-21 10:32:04       87 阅读
  4. Python语言-面向对象

    2024-01-21 10:32:04       96 阅读

热门阅读

  1. Swift 分类继承

    2024-01-21 10:32:04       50 阅读
  2. springboot使用配置文件配置我们自己配置类的值

    2024-01-21 10:32:04       58 阅读
  3. ROS 2 Humble (Ubuntu Jammy)安装配置

    2024-01-21 10:32:04       67 阅读
  4. SpringSecurity(10)——Csrf防护

    2024-01-21 10:32:04       43 阅读
  5. React Hooks 基本使用

    2024-01-21 10:32:04       44 阅读
  6. 【Ubuntu】使用NFS共享挂载硬盘

    2024-01-21 10:32:04       56 阅读
  7. 数据库学习计划

    2024-01-21 10:32:04       60 阅读
  8. PHP服务报错500的排查过程

    2024-01-21 10:32:04       37 阅读
  9. HTTP 认证方式

    2024-01-21 10:32:04       58 阅读
  10. 小程序宿主环境-组件image

    2024-01-21 10:32:04       44 阅读
  11. pytorch基础 神经网络构建

    2024-01-21 10:32:04       44 阅读
  12. 数据库原理及数据库的优化

    2024-01-21 10:32:04       53 阅读
  13. PostgreSQL 100条命令

    2024-01-21 10:32:04       47 阅读