Summer SALE
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.

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

Kompozyt w innych językach

Kompozyt w języku C# Kompozyt w języku C++ Kompozyt w języku Java Kompozyt w języku PHP Kompozyt w języku Python Kompozyt w języku Ruby Kompozyt w języku Rust Kompozyt w języku Swift Kompozyt w języku TypeScript