SOLDES de printemps
Composite

Composite en Go

Le Composite est un patron de conception structurel qui permet d’agencer les objets dans une structure ressemblant à une arborescence, afin de pouvoir la traiter comme un objet individuel.

Le composite est devenu la solution la plus populaire pour régler les problèmes d’une structure arborescente. Il offre une fonctionnalité très pratique qui permet de parcourir récursivement toute l’arborescence et d’additionner les résultats.

Exemple conceptuel

Essayons de comprendre le patron de conception composite en utilisant un exemple basé sur le système de fichiers d’un système d’exploitation. Dans le système de fichiers, nous trouverons deux types d’objets : des fichiers et des dossiers. Dans certains cas, les fichiers et dossiers seront traités de la même manière. C’est ici que le composite nous vient en aide.

Imaginez que vous devez lancer une recherche sur un mot-clef particulier dans votre système de fichiers. Ce traitement va concerner les fichiers et les dossiers. Pour un fichier, il regarde juste son contenu et pour un dossier, il parcourt tous ses fichiers pour trouver le mot-clef.

component.go: Interface du composant

package main

type Component interface {
	search(string)
}

folder.go: Composite

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

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: Code client

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: Résultat de l’exécution

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 dans les autres langues

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