Das Composite-Muster bezieht sich auf strukturelle Designmuster; in inländischen Quellen ist es als „Compositor“ bekannt.
Nehmen wir an, wir entwickeln eine Anwendung – Fotoalbum. Der Benutzer kann Ordner erstellen, dort Fotos hinzufügen und andere Manipulationen durchführen. Sie benötigen auf jeden Fall die Möglichkeit, die Anzahl der Dateien in Ordnern und die Gesamtzahl aller Dateien und Ordner anzuzeigen.
Es ist offensichtlich, dass Sie einen Baum verwenden müssen, aber wie implementiert man eine Baumarchitektur mit einer einfachen und praktischen Schnittstelle? Das Composite-Muster kommt zur Rettung.
Wir implementieren die Component-Schnittstelle mit der von uns benötigten dataCount()-Methode, über die wir die Anzahl der Dateien/Verzeichnisse zurückgeben. Erstellen wir eine Directory-Klasse mit einer Schnittstelle, die es Ihnen ermöglicht, Instanzen von Klassen hinzuzufügen/zu entfernen, die die Component-Schnittstelle gemäß dem Muster implementieren. Dies ist Composite. Wir erstellen außerdem eine File-Klasse, in der wir Bytes mit einer Fotokarte speichern, von Component erben und über dataCount 1 zurückgeben, was bedeutet, dass es nur ein Foto gibt!
Als nächstes implementieren wir im Verzeichnis die dataCount()-Methode – indem Sie alle im Array von Komponenten liegenden Elemente durchgehen und alle ihre dataCount’s addieren.
Alles ist bereit!
Unten ist ein Beispiel in 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())
}
Quellen
https://refactoring.guru/ru/design-patterns/ zusammengesetzt
