0Pricing
PHP Academy · Pelajaran

Pola Struktural: Adapter, Decorator, Facade

Susun objek dan sederhanakan antarmuka dengan pola struktural.

Pola Struktural: Adapter, Decorator, Facade adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.

Menyusun objek

Pola struktural menjelaskan cara menyusun kelas dan objek menjadi struktur yang lebih besar sambil tetap mempertahankan fleksibilitasnya. Kita membahas tiga pola utama:

  • Adaptor — membuat antarmuka yang tidak kompatibel dapat digunakan.
  • Dekorator — menambahkan perilaku tanpa pewarisan.
  • Fasad — menyajikan tampilan sederhana untuk subsistem yang kompleks.

Adaptor: masalahnya

Anda bergantung pada antarmuka PaymentGateway, tetapi SDK pihak ketiga menyediakan chargeCard($amountInCents) dengan bentuk berbeda. Memanggil SDK secara langsung membocorkan antarmukanya ke mana-mana. Di bawah, kedua antarmuka jelas tidak kompatibel — ketidakcocokan inilah yang diatasi adaptor.

<?php
// What our app wants to depend on
interface PaymentGateway { public function pay(float $dollars): string; }

// What the vendor actually gives us (cents, array result)
final class StripeSdk {
    public function chargeCard(int $cents): array {
        return ['id' => 'ch_1', 'amount' => $cents];
    }
}
// dollars vs cents, string vs array -> shapes don't line up
var_dump((new StripeSdk())->chargeCard(2000));

Adaptor dalam kode

Adaptor menyimpan objek yang diadaptasi dan mengimplementasikan antarmuka target, dengan mengonversi argumen dan nilai kembalian. Kode aplikasi Anda tetap bersih dan tidak bergantung pada vendor.

<?php
interface PaymentGateway { public function pay(float $dollars): string; }

// Third-party SDK with an incompatible API
final class StripeSdk {
    public function chargeCard(int $cents): array {
        return ['id' => 'ch_1', 'amount' => $cents];
    }
}

final class StripeAdapter implements PaymentGateway {
    public function __construct(private StripeSdk $sdk) {}
    public function pay(float $dollars): string {
        $res = $this->sdk->chargeCard((int) round($dollars * 100));
        return "charged {$res['amount']}c -> {$res['id']}";
    }
}
echo (new StripeAdapter(new StripeSdk()))->pay(20.0), PHP_EOL;

Dekorator: gagasannya

Dekorator membungkus objek yang memiliki antarmuka yang sama dan menambahkan perilaku sebelum atau sesudah mendelegasikan pekerjaan. Berbeda dari pewarisan, dekorator ditumpuk saat waktu berjalan, sehingga Anda dapat menggabungkan fitur dalam urutan apa pun tanpa ledakan jumlah kelas. Berikut kerangka minimalnya: pembungkus yang mengimplementasikan antarmuka yang sama dan menyimpan instans bagian dalam.

<?php
interface Coffee { public function cost(): float; }
final class Espresso implements Coffee {
    public function cost(): float { return 2.0; }
}
final class WithMilk implements Coffee {
    public function __construct(private Coffee $inner) {}
    public function cost(): float { return $this->inner->cost() + 0.5; }
}
echo (new WithMilk(new Espresso()))->cost(), PHP_EOL; // 2.5

Dekorator dalam kode

Setiap dekorator mengimplementasikan antarmuka yang sama dan menyimpan instans bagian dalam. Di sini kita membungkus sumber data dengan penembolokan dan pencatatan, lalu menyusunnya secara bebas.

<?php
interface DataSource { public function read(): string; }

final class FileSource implements DataSource {
    public function read(): string { return 'raw-data'; }
}

final class UpperCaseDecorator implements DataSource {
    public function __construct(private DataSource $inner) {}
    public function read(): string { return strtoupper($this->inner->read()); }
}
final class ExclaimDecorator implements DataSource {
    public function __construct(private DataSource $inner) {}
    public function read(): string { return $this->inner->read() . '!!!'; }
}

$src = new ExclaimDecorator(new UpperCaseDecorator(new FileSource()));
echo $src->read(), PHP_EOL; // RAW-DATA!!!

Dekorator dalam praktik

Perantara PSR-7 / PSR-15 pada dasarnya adalah pola dekorator yang diterapkan pada penanganan HTTP: setiap perantara membungkus perantara berikutnya, lalu menambahkan autentikasi, pencatatan, atau penembolokan di sekitar permintaan dan tanggapan. Pembungkus aliran serta lapisan tembolok PSR-6/16 juga sering menggunakan dekorasi. Ciri utamanya: pembungkus dapat menggantikan hal yang dibungkusnya.

Dekorator vs pewarisan

Pewarisan menetapkan perilaku pada waktu kompilasi dan hanya mengizinkan satu kelas dasar. Dekorasi bersifat dinamis dan dapat dikomposisikan. Pilih dekorator ketika:

  • kombinasi fitur opsional semakin banyak,
  • perilaku harus ditambahkan atau dihapus saat waktu berjalan,
  • Anda harus memperluas kelas final atau kelas pihak ketiga yang tidak dapat Anda jadikan subkelas.

Fasad: gagasannya

Fasad menyediakan satu titik masuk yang disederhanakan ke subsistem kompleks yang terdiri atas banyak kelas. Fasad tidak menyembunyikan subsistem tersebut (Anda masih dapat mengaksesnya), tetapi menyediakan antarmuka tingkat tinggi yang praktis untuk kasus umum. Bandingkan rangkaian langkah subsistem yang bertele-tele di bawah dengan pemanggilan fasad satu baris pada adegan berikutnya.

<?php
// Without a facade, the client wires every step itself
final class Cpu { public function boot(): string { return 'cpu '; } }
final class Disk { public function load(): string { return 'disk '; } }
final class Ram { public function check(): string { return 'ram'; } }

$out = (new Cpu())->boot() . (new Disk())->load() . (new Ram())->check();
echo $out, PHP_EOL; // cpu disk ram

Fasad dalam kode

Fasad mengoordinasikan beberapa kolaborator di balik satu metode. Klien memanggil place() alih-alih merangkai sendiri inventaris, pembayaran, dan pengiriman.

<?php
final class Inventory { public function reserve(string $sku): bool { return true; } }
final class Payments { public function charge(float $amt): bool { return true; } }
final class Shipping { public function dispatch(string $sku): string { return 'tracking-99'; } }

final class OrderFacade {
    public function __construct(
        private Inventory $inv,
        private Payments $pay,
        private Shipping $ship
    ) {}
    public function place(string $sku, float $amount): string {
        if (!$this->inv->reserve($sku)) { return 'out of stock'; }
        if (!$this->pay->charge($amount)) { return 'payment failed'; }
        return 'shipped: ' . $this->ship->dispatch($sku);
    }
}
echo (new OrderFacade(new Inventory(), new Payments(), new Shipping()))
    ->place('ABC', 49.99), PHP_EOL;

Membedakan ketiganya

  • Adaptor mengubah antarmuka sehingga dua bagian yang sudah ada dapat berkomunikasi; perilakunya sama, bentuknya berbeda.
  • Dekorator mempertahankan antarmuka tetapi menambahkan perilaku, dan dapat ditumpuk saat waktu berjalan.
  • Fasad memperkenalkan antarmuka baru yang lebih sederhana di depan banyak kelas.

Pengujian sederhana yang berguna: Adaptor berkaitan dengan kompatibilitas, Dekorator dengan peningkatan, dan Fasad dengan penyederhanaan.

Catatan tentang fasad Laravel

"Fasad" Laravel adalah mekanisme proksi statis yang didukung oleh wadah layanan, bukan pola Fasad Gang Empat. Tujuannya sama, yaitu menyediakan tampilan yang praktis, tetapi implementasinya berbeda. Jangan mencampuradukkan istilah kerangka kerja dengan pola struktural saat menalar tentang perancangan.

Pemeriksaan Singkat

Identifikasi pola berdasarkan maksudnya.

Ringkasan

Anda menyusun objek dengan tiga pola struktural: Adaptor untuk menjembatani antarmuka yang tidak kompatibel (misalnya SDK vendor), Dekorator untuk menumpuk perilaku saat waktu berjalan (dasar bagi perantara PSR-15), dan Fasad untuk menyediakan tampilan sederhana bagi subsistem yang kompleks. Masing-masing mengurangi keterikatan sehingga kode Anda tidak mudah terjebak pada satu vendor atau mengalami pembengkakan fitur.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola Struktural: Adapter, Decorator, Facade” gratis?

Ya — teks lengkap “Pola Struktural: Adapter, Decorator, Facade” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pola Struktural: Adapter, Decorator, Facade”?

Susun objek dan sederhanakan antarmuka dengan pola struktural. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai PHP Academy?

Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Pola Struktural: Adapter, Decorator, Facade” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?

Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Prinsip SOLID dalam Praktik
  2. Pola Pembuatan: Factory, Builder, Singleton
  3. Pola Struktural: Adapter, Decorator, Facade
  4. Pola Perilaku: Strategy, Observer, Command
← Kembali ke PHP Academy