![Kompozyt](/images/patterns/cards/composite-mini.png?id=a369d98d18b417f255d04568fd0131b8)
Kompozyt w języku Go
Kompozyt to strukturalny wzorzec projektowy umożliwiający komponowanie struktury drzewiastej z obiektów i traktowanie jej jak pojedynczy obiekt.
Kompozyt stał się dość popularnym rozwiązaniem wielu problemów gdzie w grę wchodzi struktura drzewa. Zaletą tego wzorca jest możliwość uruchamiania metod rekurencyjnie na wszystkich elementach struktury i sumowanie wyników ich działania.
Przykład koncepcyjny
Spróbujmy zrozumieć wzorzec Kompozyt posługując się przykładem opartym na systemie plików systemu operacyjnego. W systemie plików mamy dwa rodzaje obiektów: pliki oraz foldery. W niektórych przypadkach oba rodzaje należy traktować w taki sam sposób. Wzorzec Kompozyt dobrze się tu sprawdzi.
Wyobraźmy sobie, że musimy przeszukać system plików korzystając z pewnego słowa kluczowego. Przeszukując chcemy uwzględnić zarówno pliki, jak i foldery. W przypadku pliku trzeba przejrzeć jego zawartość, a w przypadku folderu przejrzeć pliki które w sobie zawiera.
component.go: Interfejs komponentu
package main
type Component interface {
search(string)
}
folder.go: Kompozyt
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: Liść
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: Kod klienta
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: Wynik działania
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