REBAJA de primavera
Composite

Composite en Go

Composite es un patrón de diseño estructural que permite componer objetos en una estructura en forma de árbol y trabajar con ella como si fuera un objeto único.

El patrón Composite se convirtió en una solución muy popular para la mayoría de problemas que requieren la creación de una estructura de árbol. La gran característica del Composite es la capacidad para ejecutar métodos de forma recursiva por toda la estructura de árbol y recapitular los resultados.

Ejemplo conceptual

Vamos a intentar imaginar el patrón Composite con un ejemplo de un sistema de archivos del sistema operativo. En el sistema de archivos hay dos tipos de objetos: archivos y carpetas. Hay casos en los que archivos y carpetas deben tratarse de la misma manera. Aquí es donde el patrón Composite resulta de utilidad.

Imagina que tienes que realizar una búsqueda de una palabra clave particular en tu sistema de archivos. Esta operación de búsqueda se aplica tanto a archivos como a carpetas. Para un archivo, buscará en los contenidos del archivo; para una carpeta, recorrerá todos los archivos de la carpeta para encontrar la palabra clave.

component.go: Interfaz componente

package main

type Component interface {
	search(string)
}

folder.go: Compuesto

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: Hoja

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: Código cliente

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.txt: Resultado de la ejecución

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

Composite en otros lenguajes

Composite en C# Composite en C++ Composite en Java Composite en PHP Composite en Python Composite en Ruby Composite en Rust Composite en Swift Composite en TypeScript