Menu
CoddyTech

Pola Observer

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 94 dari 104.

Pola Observer menetapkan dependensi satu-ke-banyak antara object: ketika satu object (subjek) mengubah status, semua object yang bergantung padanya (observer) akan diberi tahu secara otomatis. Pola ini ideal untuk sistem peristiwa, pembaruan UI, atau situasi apa pun ketika beberapa object perlu bereaksi terhadap perubahan.

Pola ini melibatkan dua peran utama: Subject yang menyimpan daftar pengamat dan memberi tahu mereka, serta Observers yang mengimplementasikan antarmuka pembaruan:

#include <iostream>
#include <vector>
#include <algorithm>

class Observer {
public:
    virtual void update(int value) = 0;
    virtual ~Observer() = default;
};

class Subject {
    std::vector<Observer*> observers;
    int state = 0;
    
public:
    void attach(Observer* obs) {
        observers.push_back(obs);
    }
    
    void detach(Observer* obs) {
        observers.erase(
            std::remove(observers.begin(), observers.end(), obs),
            observers.end());
    }
    
    void setState(int value) {
        state = value;
        notify();
    }
    
    void notify() {
        for (Observer* obs : observers) {
            obs->update(state);
        }
    }
};

class Display : public Observer {
    std::string name;
public:
    Display(const std::string& n) : name(n) {}
    void update(int value) override {
        std::cout << name << " received: " << value << "\n";
    }
};

int main() {
    Subject sensor;
    Display screen1("Screen1"), screen2("Screen2");
    
    sensor.attach(&screen1);
    sensor.attach(&screen2);
    sensor.setState(42);  // Kedua layar menerima pemberitahuan
}

Saat setState() dipanggil, subject menelusuri semua observer yang terdaftar dan memanggil method update() milik mereka. Observer dapat terhubung atau terlepas kapan saja, sehingga sistem menjadi fleksibel dan tidak terikat erat.

Gunakan Observer ketika perubahan pada satu object mengharuskan object lain diperbarui, dan kamu tidak ingin object-object ini saling terikat erat.

challenge icon

Tantangan

Mudah

Mari buat sistem pemantauan Weather Station menggunakan pola Observer. Kamu akan membuat stasiun cuaca yang melacak data suhu dan secara otomatis memberi tahu beberapa unit display setiap kali suhu berubah: penerapan pola ini yang klasik di dunia nyata.

Kamu akan menyusun kodemu dalam tiga file:

  • Observer.h: Definisikan interface observer dan observer display konkret.

    Buat class Observer abstrak dengan method virtual murni update(double temperature) yang diimplementasikan observer untuk menerima notifikasi, serta destructor virtual.

    Lalu buat class TemperatureDisplay yang mewarisi Observer. Setiap display memiliki nama (string) yang ditetapkan melalui konstruktornya. Saat update() dipanggil, class tersebut harus mencetak:

    [DisplayName]: Temperature is [temperature] degrees
  • WeatherStation.h: Buat subject yang menyimpan suhu dan memberi tahu observer.

    Class WeatherStation harus:

    • Menyimpan list pointer observer dan suhu saat ini (inisialisasi ke 0.0)
    • Memiliki method attach(Observer* obs) untuk mendaftarkan observer
    • Memiliki method detach(Observer* obs) untuk menghapus observer
    • Memiliki method setTemperature(double temp) yang memperbarui suhu dan memberi tahu semua observer yang terpasang
    • Memiliki method notify() privat yang memanggil update() pada setiap observer dengan suhu saat ini
  • main.cpp: Peragakan pola Observer dalam praktik.

    Baca tiga input:

    1. Nama untuk display pertama (string)
    2. Nama untuk display kedua (string)
    3. Nilai suhu (double)

    Buat WeatherStation dan dua object TemperatureDisplay dengan nama yang diberikan. Pasang kedua display ke stasiun, lalu atur suhu ke nilai input. Kedua display akan otomatis menerima pembaruan dan mencetak pesannya.

    Setelah itu, lepaskan display pertama dan atur suhu baru yang 5 derajat lebih tinggi daripada input. Hanya display kedua yang akan menerima pembaruan ini.

Contohnya, dengan input Kitchen, Bedroom, dan 22.5:

Kitchen: Temperature is 22.5 degrees
Bedroom: Temperature is 22.5 degrees
Bedroom: Temperature is 27.5 degrees

Dengan input Office, Lobby, dan 18.0:

Office: Temperature is 18 degrees
Lobby: Temperature is 18 degrees
Lobby: Temperature is 23 degrees

Perhatikan bagaimana pola Observer menciptakan sistem dengan keterikatan longgar: stasiun cuaca tidak perlu mengetahui apa pun tentang display tertentu, stasiun hanya memberi tahu siapa pun yang sedang mendengarkan. Saat kamu melepaskan observer, observer tersebut otomatis berhenti menerima pembaruan.

Coba sendiri

#include <iostream>
#include <string>
#include "WeatherStation.h"

using namespace std;

int main() {
    // Baca input
    string display1Name, display2Name;
    double temperature;
    
    cin >> display1Name;
    cin >> display2Name;
    cin >> temperature;
    
    // TODO: Buat object WeatherStation
    
    // TODO: Buat dua object TemperatureDisplay dengan nama dari input
    
    // TODO: Hubungkan kedua display ke stasiun cuaca
    
    // TODO: Atur suhu ke nilai input
    // (Kedua display harus mencetak pesannya)
    
    // TODO: Lepaskan display pertama
    
    // TODO: Atur suhu menjadi 5 derajat lebih tinggi daripada input
    // (Hanya display kedua yang harus mencetak pesan)
    
    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online