Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 interface Observer dengan satu method update(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). Method update()-nya mencetak "Email to [email]: [stockName] is now $[price]"
    • SmsInvestor: Menerima nomor telepon di constructornya. Method update()-nya mencetak "SMS to [phone]: [stockName] is now $[price]"
  • Stock.php: Sertakan file Observer dan buat class Stock yang 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): void untuk menambahkan observer
    • Memiliki method setPrice(float $price): void yang memperbarui harga dan memberi tahu semua observer
    Saat memberi tahu observer, panggil method update() setiap observer dengan nama saham dan harga baru.
  • main.php: Sertakan file Investors dan Stock. Kamu akan menerima tiga input: nama saham, alamat email, dan nomor telepon.

    Buat Stock dengan nama yang diberikan. Daftarkan EmailInvestor dengan alamat email dan SmsInvestor dengan nomor telepon.

    Atur harga saham ke 150.50 untuk 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
?>
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