Composite Pattern #

Dalam pengembangan software, sering kali kita berhadapan dengan struktur objek yang bersifat hierarkis—misalnya tree menu, struktur folder, atau UI component. Tantangannya adalah bagaimana memperlakukan objek tunggal dan kumpulan objek dengan cara yang sama tanpa membuat kode menjadi penuh kondisi (if/else).

Di sinilah Composite Pattern berperan. Pattern ini memungkinkan client untuk memperlakukan objek individual dan komposisi objek secara uniform.

Apa itu Composite Pattern? #

Composite Pattern adalah salah satu structural design pattern yang bertujuan untuk menyusun objek ke dalam struktur tree untuk merepresentasikan relasi part-whole.

Dengan Composite Pattern:

  • Objek tunggal (leaf)
  • Objek gabungan (composite)

keduanya mengimplementasikan interface yang sama, sehingga client tidak perlu membedakan keduanya.

“Treat individual objects and compositions of objects uniformly.”


Tujuan Pattern #

Composite Pattern digunakan untuk:

  1. Menyederhanakan interaksi dengan struktur hierarkis
  2. Menghilangkan conditional logic berdasarkan tipe objek
  3. Memungkinkan penambahan jenis node baru tanpa mengubah client code
  4. Merepresentasikan relasi part–whole secara eksplisit

Kapan Cocok Digunakan? #

Gunakan Composite Pattern jika:

  • Data atau objek Anda berbentuk tree / hierarki
  • Client perlu memperlakukan objek tunggal dan kumpulan objek dengan cara yang sama
  • Operasi yang dilakukan bersifat rekursif pada struktur
  • Anda ingin menghindari pengecekan tipe (type switch, instanceof)

Contoh Use Case Nyata #

  • File system: File dan Folder
  • UI component: Button, Panel, Form
  • Menu dan submenu
  • Struktur organisasi
  • Document object model (DOM)

Struktur Pattern #

Composite Pattern biasanya terdiri dari:

  1. Component – interface umum
  2. Leaf – objek tunggal
  3. Composite – objek yang memiliki child
  4. Client – menggunakan component tanpa peduli tipe konkretnya

Contoh Implementasi (Golang) #

Studi Kasus #

Kita akan membuat struktur menu di mana menu bisa berupa:

  • Item menu biasa
  • Sub-menu yang berisi menu lain

Component Interface #

package menu

type Component interface {
    Render(indent int) string
}

Leaf: MenuItem #

package menu

import "strings"

type MenuItem struct {
    Name string
}

func (m *MenuItem) Render(indent int) string {
    return strings.Repeat("  ", indent) + "- " + m.Name + "\n"
}

Composite: MenuGroup #

package menu

import "strings"

type MenuGroup struct {
    Name     string
    Children []Component
}

func (m *MenuGroup) Add(c Component) {
    m.Children = append(m.Children, c)
}

func (m *MenuGroup) Render(indent int) string {
    result := strings.Repeat("  ", indent) + m.Name + ":\n"
    for _, child := range m.Children {
        result += child.Render(indent + 1)
    }
    return result
}

Client Code #

package main

import (
    "fmt"
    "yourapp/menu"
)

func main() {
    root := &menu.MenuGroup{Name: "Main Menu"}

    file := &menu.MenuGroup{Name: "File"}
    file.Add(&menu.MenuItem{Name: "New"})
    file.Add(&menu.MenuItem{Name: "Open"})

    edit := &menu.MenuGroup{Name: "Edit"}
    edit.Add(&menu.MenuItem{Name: "Copy"})
    edit.Add(&menu.MenuItem{Name: "Paste"})

    root.Add(file)
    root.Add(edit)

    fmt.Println(root.Render(0))
}

Penjelasan #

  • MenuItem adalah Leaf
  • MenuGroup adalah Composite yang dapat berisi Component lain
  • Client hanya berinteraksi dengan Component
  • Operasi Render berjalan rekursif

Kelebihan dan Kekurangan #

Kelebihan #

  • Kode client lebih sederhana
  • Mudah menambah node baru
  • Representasi struktur hierarkis jelas

Kekurangan #

  • Sulit membatasi operasi tertentu hanya untuk leaf
  • Struktur bisa menjadi terlalu umum

Best Practices #

1. Interface Harus Stabil #

Pastikan interface Component tidak sering berubah karena akan berdampak ke semua implementasi.

2. Gunakan Recursion dengan Hati-hati #

Pastikan tidak ada cyclic reference dalam composite tree.

3. Composite Bertanggung Jawab pada Child #

Logic penambahan dan penghapusan child sebaiknya ada di composite, bukan client.

4. Jangan Paksa Composite #

Jika struktur tidak hierarkis, jangan gunakan Composite hanya karena “pattern”.


Penutup #

Composite Pattern adalah solusi elegan untuk menangani struktur hierarkis dalam software. Dengan memperlakukan objek tunggal dan komposisi secara seragam, kode menjadi lebih bersih, extensible, dan mudah dirawat.

Pattern ini sangat umum digunakan dan layak dikuasai, terutama jika Anda sering berurusan dengan tree structure dalam sistem berskala menengah hingga

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact