Pola Perilaku: Strategy, Observer, Command
Modelkan perilaku dan komunikasi dengan pola perilaku.
Pola Perilaku: Strategy, Observer, Command adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Memodelkan perilaku
Pola perilaku mengatur cara objek berkolaborasi dan membagi tanggung jawab. Kita berfokus pada tiga pola yang terus muncul dalam sistem PHP nyata:
- Strategi — menukar algoritme saat waktu berjalan.
- Observer — menyiarkan peristiwa kepada pendengar yang berminat.
- Command — mengubah permintaan menjadi objek yang dapat Anda masukkan ke antrean, catat, atau batalkan.
Strategi: gagasannya
Pola Strategi mendefinisikan keluarga algoritme yang dapat dipertukarkan di balik satu antarmuka dan memungkinkan klien memilihnya saat waktu berjalan. Pola ini menggantikan switch yang melebar di bawah dengan polimorfisme: konteks mendelegasikan pekerjaan kepada strategi yang dipegangnya.
<?php
// The smell Strategy removes: branching on a type code
function price(string $type, float $base): float {
switch ($type) {
case 'standard': return $base + 5;
case 'express': return $base + 15;
default: throw new InvalidArgumentException($type);
}
}
echo price('express', 10), PHP_EOL; // 25
Strategi dalam kode
Di sini biaya pengiriman bergantung pada pengangkut yang dipilih. Setiap strategi merangkum satu algoritme penetapan harga; konteks tetap tidak berubah saat Anda menambahkan pengangkut.
<?php
interface ShippingStrategy { public function cost(float $weight): float; }
final class Standard implements ShippingStrategy {
public function cost(float $w): float { return 5 + $w * 0.5; }
}
final class Express implements ShippingStrategy {
public function cost(float $w): float { return 15 + $w * 1.2; }
}
final class Cart {
public function __construct(private ShippingStrategy $strategy) {}
public function setStrategy(ShippingStrategy $s): void { $this->strategy = $s; }
public function quote(float $weight): float { return $this->strategy->cost($weight); }
}
$cart = new Cart(new Standard());
echo $cart->quote(10), PHP_EOL; // 10
$cart->setStrategy(new Express());
echo $cart->quote(10), PHP_EOL; // 27
Strategi dengan penutupan
Dalam PHP, strategi tidak selalu memerlukan kelas. Untuk kasus ringan, callable atau sintaks callable kelas satu merupakan strategi yang sepenuhnya sah. Gunakan kelas lengkap jika algoritmenya memiliki keadaan atau dependensinya sendiri; gunakan penutupan untuk pilihan sederhana tanpa keadaan.
<?php
$strategies = [
'asc' => fn(array $a) => sort($a) ? $a : $a,
'desc' => fn(array $a) => rsort($a) ? $a : $a,
];
$data = [3, 1, 2];
print_r($strategies['desc']($data)); // [3,2,1]
Observer: gagasannya
Pola Observer memungkinkan subjek memberi tahu banyak pengamat ketika keadaannya berubah, tanpa mengetahui siapa mereka. Ini memisahkan sumber peristiwa dari penangannya dan menjadi dasar bagi sistem peristiwa, kait, serta pembaruan reaktif.
Observer dalam kode
Subjek menyimpan daftar pengamat dan memanggil update() pada masing-masing pengamat. Pendengar baru dapat memasang diri tanpa mengubah logika subjek.
<?php
interface Observer { public function update(string $event): void; }
final class OrderSubject {
private array $observers = [];
public function subscribe(Observer $o): void { $this->observers[] = $o; }
public function placed(string $id): void {
foreach ($this->observers as $o) { $o->update("order $id placed"); }
}
}
final class EmailObserver implements Observer {
public function update(string $e): void { echo "email: $e" . PHP_EOL; }
}
final class AuditObserver implements Observer {
public function update(string $e): void { echo "audit: $e" . PHP_EOL; }
}
$subject = new OrderSubject();
$subject->subscribe(new EmailObserver());
$subject->subscribe(new AuditObserver());
$subject->placed('42');
Observer vs PSR-14
PHP modern sering menerapkan Observer melalui pendistribusi peristiwa PSR-14: pendistribusi merutekan objek peristiwa ke pendengar yang terdaftar. Model mentalnya sama (subjek = peristiwa, pengamat = pendengar), tetapi pendistribusi memisahkan keduanya lebih jauh dan mendukung peristiwa yang dapat dihentikan. SplObserver/SplSubject tersedia dalam SPL, tetapi saat ini jarang digunakan.
Command: gagasannya
Pola Command merangkum permintaan sebagai objek: tindakan, penerima, dan parameternya. Karena permintaan kini berupa data, Anda dapat memasukkannya ke antrean, mencatatnya, mencoba ulang, atau membatalkannya. Perintah paling sederhana hanya mewujudkan niat sebagai nilai, seperti ditunjukkan di bawah.
<?php
final class SendEmail {
public function __construct(
public readonly string $to,
public readonly string $subject
) {}
}
// The request is now data you can store, serialize, or enqueue
$cmd = new SendEmail('user@example.com', 'Welcome');
echo json_encode($cmd), PHP_EOL;
Command dalam kode
Setiap perintah mengimplementasikan execute(). Pemanggil menyimpan dan menjalankannya, terpisah dari apa yang dilakukannya. Menambahkan undo() mengubahnya menjadi tumpukan pembatalan lengkap.
<?php
interface Command { public function execute(): string; }
final class Light { public bool $on = false; }
final class TurnOn implements Command {
public function __construct(private Light $light) {}
public function execute(): string { $this->light->on = true; return 'light on'; }
}
final class TurnOff implements Command {
public function __construct(private Light $light) {}
public function execute(): string { $this->light->on = false; return 'light off'; }
}
final class Invoker {
private array $queue = [];
public function add(Command $c): void { $this->queue[] = $c; }
public function run(): void {
foreach ($this->queue as $c) { echo $c->execute(), PHP_EOL; }
}
}
$light = new Light();
$inv = new Invoker();
$inv->add(new TurnOn($light));
$inv->add(new TurnOff($light));
$inv->run();
Bus perintah
Kerangka kerja membangun bus perintah berdasarkan pola ini: objek transfer data perintah dikirim tepat kepada satu penangan. Perantara di sekitar bus dapat menambahkan transaksi, validasi, dan pencatatan secara seragam. Karena perintah berupa objek biasa yang dapat diserialisasi, penangan yang sama dapat dijalankan secara sinkron atau dimasukkan ke pekerja antrean.
Memilih di antara ketiganya
- Strategi: satu operasi, banyak algoritme yang dapat dipertukarkan, dipilih oleh pemanggil.
- Observer: satu peristiwa, banyak reaksi independen; sumbernya tidak mengetahui para penangan.
- Command: mewujudkan permintaan agar dapat dimasukkan ke antrean, dicatat, dicoba ulang, atau dibatalkan.
Ketiganya dapat dipadukan dengan baik: penangan perintah dapat memilih strategi dan memancarkan peristiwa Observer.
Pemeriksaan Singkat
Cocokkan kebutuhan dengan polanya.
Ringkasan
Anda memodelkan perilaku dengan tiga pola: Strategi untuk menukar algoritme saat waktu berjalan (kelas atau penutupan), Observer untuk menyiarkan perubahan keadaan kepada pendengar yang terpisah (dasar bagi pendistribusi PSR-14), dan Command untuk mengubah permintaan menjadi objek yang dapat Anda masukkan ke antrean, catat, dan batalkan (dasar bagi bus perintah). Bersama-sama, pola-pola ini menjaga kolaborasi tetap fleksibel dan tanggung jawab tetap jelas.
Belajar PHP dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola Perilaku: Strategy, Observer, Command” gratis?
Ya — teks lengkap “Pola Perilaku: Strategy, Observer, Command” 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 Perilaku: Strategy, Observer, Command”?
Modelkan perilaku dan komunikasi dengan pola perilaku. 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 4 dari 4.
Berapa lama pelajaran “Pola Perilaku: Strategy, Observer, Command” 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
- Prinsip SOLID dalam Praktik
- Pola Pembuatan: Factory, Builder, Singleton
- Pola Struktural: Adapter, Decorator, Facade
- Pola Perilaku: Strategy, Observer, Command