Hura! Mamy wreszcie przyjemność udostępnić wam polską wersję! Zapraszamy do przesyłania wiadomości z waszymi uwagami i informacjami o zauważonych błędach.
Kompozyt

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.

file.go: Interfejs komponentu

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
}

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)
}

component.go: Liść

package main

type component interface {
	search(string)
}

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
Na podstawie: Golang By Example

Kompozyt w innych językach

Wzorce projektowe: Kompozyt w języku Java Wzorce projektowe: Kompozyt w języku C# Wzorce projektowe: Kompozyt w języku C++ Wzorce projektowe: Kompozyt w języku PHP Wzorce projektowe: Kompozyt w języku Python Wzorce projektowe: Kompozyt w języku Ruby Wzorce projektowe: Kompozyt w języku Swift Wzorce projektowe: Kompozyt w języku TypeScript