1. Apa itu pola komposit

Pola Komposit adalah pola desain struktural objek yang umum digunakan. Ini menggabungkan objek ke dalam struktur pohon untuk mewakili hubungan "bagian-keseluruhan" bertingkat, memungkinkan klien untuk menangani objek individual dan komposisi objek dengan cara yang konsisten.

2. Karakteristik dan keunggulan pola komposit

Keuntungan utama dari pola komposit adalah:

  1. Ini dapat dengan jelas mendefinisikan objek kompleks bertingkat, yang mewakili semua atau sebagian dari hirarki objek, sehingga lebih mudah menambahkan komponen baru.
  2. Ini menyediakan antarmuka bersatu, menjadikan akses ke bagian-bagian komposit dan objek individual konsisten, memungkinkan klien untuk menggunakan objek tunggal dan objek komposit secara seragam.

3. Skenario aplikasi pola komposit

  1. Saat Anda ingin mewakili hirarki bagian-keseluruhan dari objek.
  2. Saat Anda ingin klien mengabaikan perbedaan antara objek komposit dan objek individual, dan menggunakan semua objek dalam struktur komposit secara seragam.

4. Implementasi pola komposit di Golang

Misalkan kita sedang merancang aplikasi e-commerce, katalog produk adalah contoh yang bagus dari pola komposit. Sebuah kategori dapat berisi kategori lain, dan juga produk (seperti kategori elektronik berisi ponsel, komputer, dan ponsel berisi iPhone, Samsung, dll.).

4.1 Diagram Kelas UML

Pola Komposit di Golang

4.2 Pengantar Contoh

Dalam contoh ini, kita memiliki Component (jelas menggunakan fitur antarmuka orientasi objek) sebagai kelas dasar abstrak, dan Composite dan Leaf keduanya mengimplementasikan antarmuka ini, mewakili objek wadah dan objek dasar, masing-masing.

4.3 Langkah Implementasi 1: Mendefinisikan kelas komponen abstrak

4.3.1 Mendefinisikan antarmuka kelas komponen abstrak

//Component: Antarmuka komponen dasar, mendefinisikan kesamaan grup dan individu
type Component interface {
    Cari(string)
}

4.3.2 Implementasi metode dasar dari kelas komponen abstrak

Langkah ini secara khusus diimplementasikan dalam kelas komponen kontainer dan kelas komponen daun.

4.4 Langkah Implementasi 2: Mendefinisikan kelas komponen daun

Kelas konkret ini mewakili kategori dasar atau objek dalam hirarki, dan tidak memiliki lapisan objek berikutnya.

4.4.1 Memiliki dari kelas komponen abstrak

Di Go, pewarisan antarmuka diimplementasikan melalui cara metode diimplementasikan melalui Struct.

4.4.2 Implementasi metode khusus dari kelas komponen daun

//Product: Mewakili node daun, yaitu, produk, dan tidak dapat memiliki node anak
type Product struct {
    Nama string
}

//Cari: Cari produk
func (p *Product) Cari(keyword string) {
    if strings.Contains(p.Nama, keyword) {
        fmt.Printf("Produk: '%s' mengandung kata kunci: '%s'\n", p.Nama, keyword)
    }
}

4.5 Langkah Implementasi 3: Mendefinisikan kelas komponen kontainer

Kelas ini digunakan untuk menyimpan dan mengelola objek anak, umumnya termasuk beberapa metode untuk mengelola dan mengatur objek anak, seperti tambah(Component), hapus(Component), dll.

4.5.1 Memiliki dari kelas komponen abstrak

Ini juga diimplementasikan dengan menggunakan Struct untuk mengimplementasikan metode antarmuka dalam Go.

4.5.2 Implementasi Metode Khusus Kelas Komponen Kontainer

//Category: Mewakili node kontainer, yaitu, kategori produk, yang dapat memiliki node anak
type Category struct {
    Nama     string
    Anak []Component
}

// Tambah: Tambahkan node anak
func (c *Category) Tambah(child Component) {
    c.Anak = append(c.Anak, child)
}

// Hapus: Hapus node anak
func (c *Category) Hapus(child Component) {
    // Implementasi spesifik dihilangkan
}

// Cari: Cari produk
func (c *Category) Cari(keyword string) {
    fmt.Printf("Kategori: %s\n", c.Nama)
    for _, komposit := range c.Anak {
        komposit.Cari(keyword)
    }
}

4.6 Langkah Implementasi 4: Contoh Kode Klien

Membuat sebuah struktur, menyusunnya menjadi struktur pohon, dan kemudian memanggil operasi akses dari struktur pohon.

func main() {
    root := &Category{Name: "Akar"}
    electronics := &Category{Name: "Elektronik"}

    phone := &Product{Name: "Telepon"}
    tv := &Product{Name: "Televisi"}

    root.Add(electronics)
    electronics.Add(phone)
    electronics.Add(tv)

    root.Search("telepon") // Ini akan mencari di semua anak
}