![Composite](/images/patterns/cards/composite-mini.png?id=a369d98d18b417f255d04568fd0131b8)
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