Composite adalah structural design pattern yang memungkinkan menyusun objek menjadi struktur seperti tree dan bekerja dengannya seolah-olah itu adalah objek tunggal.
Composite termasuk solusi yang cukup populer untuk sebagian besar masalah yang membutuhkan pembangunan struktur tree. Fitur Composite yang penting adalah kemampuan untuk menjalankan metode secara rekursif di seluruh struktur tree dan meringkas hasilnya.
Mari kita gunakan contoh file system pada OS. Terdapat dua tipe yaitu file dan folder. Pada kasus tertentu, files dan folders harus diperlakukan sama. Disini pattern Composite dapat digunakan.
Misalnya, Anda perlu melakukan search pada file system. Search akan dilakukan baik pada folders maupun pada files. Pada file, pencarian akan dilakukan pada isi file, sementara pada folder, pencarian akan dilakukan pada seluruh file yang terdapat didalam folder.
Berikut contoh implementasi Composite pada golang.
package main import "fmt" //composite interface 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 } //composite 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) } //leaf type component interface { search(string) } 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("budi") }
Serching recursively for keyword budi in folder Folder2
Searching for keyword budi in file File2
Searching for keyword budi in file File3
Serching recursively for keyword budi in folder Folder1
Searching for keyword budi in file File1