Pola Observer
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 73 dari 91.
Observer Pattern adalah pola desain perilaku yang membangun hubungan satu-ke-banyak antara object. Ketika satu object (subject) berubah status, semua dependennya (observers) akan otomatis diberi tahu dan diperbarui.
Bayangkan langganan buletin. Buletin adalah subject, dan para pelanggan adalah observer. Saat edisi baru diterbitkan, semua pelanggan menerimanya secara otomatis tanpa buletin perlu mengetahui detail setiap pelanggan.
Berikut implementasi dasar dalam PHP:
<?php
interface Observer {
public function update(string $message): void;
}
class Newsletter {
private array $subscribers = [];
public function subscribe(Observer $observer): void {
$this->subscribers[] = $observer;
}
public function publish(string $content): void {
foreach ($this->subscribers as $subscriber) {
$subscriber->update($content);
}
}
}
class EmailSubscriber implements Observer {
public function __construct(private string $email) {}
public function update(string $message): void {
echo "Sending to {$this->email}: $message\n";
}
}
$newsletter = new Newsletter();
$newsletter->subscribe(new EmailSubscriber("alice@example.com"));
$newsletter->subscribe(new EmailSubscriber("bob@example.com"));
$newsletter->publish("New article released!");
Keluaran:
Sending to alice@example.com: New article released!
Sending to bob@example.com: New article released!Pola ini memisahkan subject dari para observer-nya. Class Newsletter tidak perlu mengetahui apakah class tersebut memberi tahu pelanggan email, pelanggan SMS, atau layanan notifikasi push. Class ini cukup memanggil update() pada apa pun yang mengimplementasikan interface Observer. Dengan begitu, menambahkan tipe observer baru menjadi mudah tanpa mengubah kode yang sudah ada.
Tantangan
MudahMari buat sistem peringatan harga saham menggunakan Observer Pattern. Saat harga saham berubah, semua investor yang terdaftar harus diberi tahu secara otomatis: ini adalah penerapan nyata yang sempurna untuk pola ini.
Kamu akan mengatur kodemu dalam empat file:
Observer.php: Definisikan interfaceObserverdengan satu methodupdate(string $stockName, float $price): void. Ini adalah kontrak yang harus diikuti semua observer untuk menerima notifikasi.Investors.php: Sertakan file Observer dan buat dua class yang mengimplementasikan interface tersebut:EmailInvestor: Menerima alamat email di constructornya (gunakan promosi constructor). Methodupdate()-nya mencetak"Email to [email]: [stockName] is now $[price]"SmsInvestor: Menerima nomor telepon di constructornya. Methodupdate()-nya mencetak"SMS to [phone]: [stockName] is now $[price]"
Stock.php: Sertakan file Observer dan buat classStockyang bertindak sebagai subjek. Stock-mu harus:- Menyimpan nama saham dan harga saat ini (gunakan promosi constructor untuk nama, inisialisasi harga ke
0.0) - Menyimpan array observer privat
- Memiliki method
subscribe(Observer $observer): voiduntuk menambahkan observer - Memiliki method
setPrice(float $price): voidyang memperbarui harga dan memberi tahu semua observer
update()setiap observer dengan nama saham dan harga baru.- Menyimpan nama saham dan harga saat ini (gunakan promosi constructor untuk nama, inisialisasi harga ke
main.php: Sertakan file Investors dan Stock. Kamu akan menerima tiga input: nama saham, alamat email, dan nomor telepon.Buat
Stockdengan nama yang diberikan. DaftarkanEmailInvestordengan alamat email danSmsInvestordengan nomor telepon.Atur harga saham ke
150.50untuk memicu notifikasi kepada semua pelanggan.
Observer Pattern menjaga agar class Stock tidak bergantung pada method notifikasi tertentu. Kamu dapat dengan mudah menambahkan PushInvestor atau SlackInvestor nanti tanpa mengubah class Stock sama sekali.
Coba sendiri
<?php
require_once 'Investors.php';
require_once 'Stock.php';
// Baca input
$stockName = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: Buat Stock dengan nama yang diberikan
// TODO: Daftarkan EmailInvestor dengan alamat email
// TODO: Daftarkan SmsInvestor dengan nomor telepon
// TODO: Tetapkan harga saham ke 150.50 untuk memicu notifikasi
?>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 Siswa2Namespace 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