![Компонувальник](/images/patterns/cards/composite-mini.png?id=a369d98d18b417f255d04568fd0131b8)
Компонувальник на Go
Компонувальник — це структурний патерн, який дозволяє створювати дерево об’єктів та працювати з ним так само, як і з одиничним об’єктом.
Компонувальник давно став синонімом всіх завдань, пов’язаних з побудовою дерева об’єктів. Всі операції компонувальника базуються на рекурсії та «підсумовуванні» результатів на гілках дерева.
Концептуальний приклад
Давайте спробуємо зрозуміти патерн Компонувальник, використовуючи за приклад файлову систему ОС. Всередині неї є два типи об’єктів: файли і папки. У деяких випадках вони мусять сприйматися як одне і те саме. Тут нам стане в нагоді патерн проектування Компонувальник.
Уявіть, що вам потрібно провести пошук за конкретним ключовим словом у вашій файловій системі. Така операція пошуку застосовується як до файлів, так і до папок. У випадку файлу, вона тільки перевірить вміст файлу, а у випадку папки — обробить всі файли цієї папки, очікуючи на знаходження ключового слова.
component.go: Інтерфейс компонента
package main
type Component interface {
search(string)
}
folder.go: Компонувальник
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: Лист
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: Клієнтський код
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: Результат виконання
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