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:
1810Kode 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.
Tantangan
MudahMari 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 interfaceOrganizationUnityang akan diimplementasikan oleh karyawan individu maupun departemen. Interface ini harus memiliki dua method:getName(): stringdangetSalary(): 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 classEmployeeyang 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 classDepartmentyang 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): voiduntuk 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
Departmentakar bernama"Company". Untuk setiap departemen dalam JSON, buat sebuahDepartment, 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]
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa10Konsep OOP Lanjutan
Komposisi vs PewarisanInjeksi Dependensiclass AnonimEnum (PHP 8.1)Fiber (PHP 8.1)Pendalaman Kloning objectGenerator dan Iterator13Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola Repository2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online