Le modèle composite fait référence à des modèles de conception structurelle ; dans les sources nationales, il est connu sous le nom de « compositeur ».
Disons que nous développons une application – photo album. L’utilisateur peut créer des dossiers, y ajouter des photos et effectuer d’autres manipulations. Vous avez absolument besoin de pouvoir afficher le nombre de fichiers dans les dossiers, le nombre total de tous les fichiers et dossiers.
Il est évident qu’il faut utiliser un arbre, mais comment implémenter une architecture arborescente avec une interface simple et pratique ? Le motif Composite vient à la rescousse.
Nous implémentons l’interface Component avec la méthode dataCount() dont nous avons besoin, grâce à laquelle nous renverrons le nombre de fichiers/répertoires. Créons une classe Directory avec une interface qui vous permet d’ajouter/supprimer des instances de classes qui implémentent l’interface Component selon le modèle, c’est Composite ; Nous allons également créer une classe File, dans laquelle nous stockons les octets avec une carte photo, héritons de Component et renvoyons 1 via dataCount, indiquant qu’il n’y a qu’une seule photo !
Ensuite, dans le répertoire, nous implémentons la méthode dataCount() – en parcourant tous les éléments du tableau de composants, en additionnant tous leurs dataCount.
Tout est prêt !
Voici un exemple dans Go :
package main
import "fmt"
type component interface {
dataCount() int
}
type file struct {
}
type directory struct {
c []component
}
func (f file) dataCount() int {
return 1
}
func (d directory) dataCount() int {
var outputDataCount int = 0
for _, v := range d.c {
outputDataCount += v.dataCount()
}
return outputDataCount
}
func (d *directory) addComponent(c component) {
d.c = append(d.c, c)
}
func main() {
var f file
var rd directory
rd.addComponent(f)
rd.addComponent(f)
rd.addComponent(f)
rd.addComponent(f)
fmt.Println(rd.dataCount())
var sd directory
sd.addComponent(f)
rd.addComponent(sd)
rd.addComponent(sd)
rd.addComponent(sd)
fmt.Println(sd.dataCount())
fmt.Println(rd.dataCount())
}
Sources
https://refactoring.guru/ru/design-patterns/ composite
