Привіт! Я знизив ціни на усі продукти. Час разом готувати свої програмерські скіли до пост-COVID-ної ери. Перевірити »
Компонувальник

Компонувальник на Go

Компонувальник — це структурний патерн, який дозволяє створювати дерево об’єктів та працювати з ним так само, як і з одиничним об’єктом.

Компонувальник давно став синонімом всіх завдань, пов’язаних з побудовою дерева об’єктів. Всі операції компонувальника базуються на рекурсії та «підсумовуванні» результатів на гілках дерева.

Концептуальний приклад

Давайте спробуємо зрозуміти патерн Компонувальник, використовуючи за приклад файлову систему ОС. Всередині неї є два типи об’єктів: файли і папки. У деяких випадках вони мусять сприйматися як одне і те саме. Тут нам стане в нагоді патерн проектування Компонувальник.

Уявіть, що вам потрібно провести пошук за конкретним ключовим словом у вашій файловій системі. Така операція пошуку застосовується як до файлів, так і до папок. У випадку файлу, вона тільки перевірить вміст файлу, а у випадку папки — обробить всі файли цієї папки, очікуючи на знаходження ключового слова.

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
}

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

component.go: Лист

package main

type component interface {
	search(string)
}

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
На основі: Golang By Example

Компонувальник іншими мовами програмування

Компонувальник на Java Компонувальник на C# Компонувальник на C++ Компонувальник на PHP Компонувальник на Python Компонувальник на Ruby Компонувальник на Swift Компонувальник на TypeScript