Menu
CoddyTech

Pola Composite

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 80 dari 91.

Composite Pattern adalah pola desain struktural yang memungkinkan kamu menyusun object menjadi struktur pohon, lalu bekerja dengan struktur tersebut seolah-olah semuanya adalah object individual. Pola ini cocok untuk merepresentasikan hierarki bagian-keseluruhan ketika kamu ingin memperlakukan object tunggal dan kelompok object secara seragam.

Bayangkan sebuah sistem file. Sebuah folder dapat berisi file dan folder lainnya.

Saat menghitung ukuran total, kamu ingin memanggil method yang sama pada file dan folder, dan folder harus menjumlahkan isi di dalamnya secara rekursif. Composite Pattern membuat proses ini berjalan mulus dengan memberikan antarmuka yang sama kepada leaf (file) dan composite (folder).

<?php
interface FileSystemItem {
    public function getName(): string;
    public function getSize(): int;
}

class File implements FileSystemItem {
    public function __construct(
        private string $name,
        private int $size
    ) {}
    
    public function getName(): string {
        return $this->name;
    }
    
    public function getSize(): int {
        return $this->size;
    }
}

class Folder implements FileSystemItem {
    private array $items = [];
    
    public function __construct(private string $name) {}
    
    public function getName(): string {
        return $this->name;
    }
    
    public function add(FileSystemItem $item): void {
        $this->items[] = $item;
    }
    
    public function getSize(): int {
        $total = 0;
        foreach ($this->items as $item) {
            $total += $item->getSize();
        }
        return $total;
    }
}

Sekarang kamu bisa membuat struktur pohon dan memperlakukannya secara seragam:

<?php
$docs = new Folder("Documents");
$docs->add(new File("resume.pdf", 250));
$docs->add(new File("cover.docx", 50));

$images = new Folder("Images");
$images->add(new File("photo.jpg", 1500));

$root = new Folder("Root");
$root->add($docs);
$root->add($images);
$root->add(new File("readme.txt", 10));

echo $root->getSize();

Output:

1810

Kode client memanggil getSize() tanpa perlu memedulikan apakah yang ditangani adalah satu file atau struktur folder bersarang yang dalam. Pola ini menangani rekursi secara internal, sehingga hierarki yang kompleks mudah digunakan.

challenge icon

Tantangan

Mudah

Mari buat sistem bagan organisasi menggunakan Composite Pattern. Perusahaan memiliki struktur hierarkis, di mana departemen dapat berisi karyawan dan subdepartemen lainnya: struktur pohon yang sempurna untuk menghitung total secara seragam di seluruh organisasi.

Kamu akan mengatur kodemu dalam empat file:

  • OrganizationUnit.php: Definisikan interface OrganizationUnit yang akan diimplementasikan oleh karyawan individu maupun departemen. Interface ini harus memiliki dua method: getName(): string dan getSalary(): int. Interface umum ini memungkinkan kamu memperlakukan karyawan tunggal dan seluruh departemen dengan cara yang sama saat menghitung biaya.
  • Employee.php: Sertakan interface OrganizationUnit dan buat class Employee yang mengimplementasikannya. Karyawan adalah simpul daun dalam pohon organisasi. Mereka memiliki nama dan gaji, tetapi tidak dapat berisi unit lain. Gunakan promosi constructor untuk menerima nama dan gaji, lalu implementasikan kedua method interface.
  • Department.php: Sertakan interface OrganizationUnit dan buat class Department yang mengimplementasikannya. Departemen adalah composite yang dapat berisi karyawan maupun departemen lain. Departemenmu harus:
    • Menerima nama di constructornya
    • Mengimplementasikan getName() untuk mengembalikan nama departemen
    • Memiliki method add(OrganizationUnit $unit): void untuk menambahkan karyawan atau subdepartemen
    • Mengimplementasikan getSalary() untuk mengembalikan total gaji semua unit yang dikandungnya, dengan menjumlahkan semuanya secara rekursif
  • main.php: Sertakan file Employee dan Department. Kamu akan menerima satu input: string JSON yang merepresentasikan struktur organisasi.

    JSON akan memiliki format berikut:

    {"Engineering": [{"name": "Alice", "salary": 80000}, {"name": "Bob", "salary": 75000}], "Sales": [{"name": "Carol", "salary": 65000}]}

    Setiap key adalah nama departemen, dan nilainya adalah array karyawan yang berisi nama dan gaji mereka.

    Buat Department akar bernama "Company". Untuk setiap departemen dalam JSON, buat sebuah Department, tambahkan karyawannya, lalu tambahkan departemen tersebut ke Company. Terakhir, tampilkan total gaji perusahaan dengan format berikut:

    Total Salary: [amount]

Keunggulan Composite Pattern adalah pemanggilan getSalary() pada departemen Company akan otomatis menghitung jumlah gaji semua departemen dan karyawan bersarang: kode client tidak perlu mengetahui struktur internalnya.

Coba sendiri

<?php
require_once 'Employee.php';
require_once 'Department.php';

// Baca input JSON
$input = trim(fgets(STDIN));
$data = (array)json_decode($input, true);

// TODO: Buat Department induk bernama "Company"

// TODO: Lakukan perulangan untuk setiap departemen dalam data JSON
// Untuk setiap departemen:
//   - Buat object Department baru
//   - Tambahkan setiap karyawan ke departemen tersebut
//   - Tambahkan departemen tersebut ke Company

// TODO: Tampilkan total gaji dalam format: Total Salary: [amount]

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online