CodeBlanks Logo Icon CodeBlanks

Observer

Observer deseniyle olay tabanlı bildirim öğrenirsin.

Observer deseni nedir?

Observer, bir nesnenin (subject) durumu değiştiğinde bağlı tüm gözlemcilere (observer) haber verilmesini sağlar. Bu, bire-çok (one-to-many) bir bağımlılıktır. Olay tabanlı sistemlerde, haber akışlarında ve GUI güncellemelerinde sık kullanılır.

C++'ta Subject sınıfı bir Observer listesi tutar. attach(o) ile gözlemci eklenir, notify(msg) ile her birinin update(msg) metodu çağrılır. Gözlemciler Observer soyut sınıfından türetilir; böylece farklı gözlemci türleri aynı subject'e bağlanabilir.

attach ve notify

Subject sınıfı içinde std::vector<Observer*> tutulur. attach(Observer* o) metodu bu listeye işaretçi ekler. notify(const std::string& msg) metodu listedeki her gözlemci için update(msg) çağırır.

Örnek: subject.attach(&observer); ile bir gözlemci bağlanır. Sonra subject.notify("Merhaba"); çağrıldığında her gözlemcinin update'i çalışır. Gözlemci sayısı artsa da subject aynı notify koduyla hepsine haber verir. Bu, yeni gözlemci türü eklemeyi de kolaylaştırır: yalnızca yeni bir Observer alt sınıfı yazarsın.

Uygulama Subject ve Observer yaz

Observer soyut sınıfını tanımla: virtual void update(const std::string& msg) = 0;. PrintObserver alt sınıfı update'te std::cout << msg; yapsın. Subject sınıfı std::vector<Observer*> tutsun, attach(Observer*) ve notify(const std::string&) metotları olsun. main içinde bir Subject ve bir PrintObserver oluştur, attach et, notify("Merhaba") çağır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <vector>
#include <string>

// Observer soyut sınıfını ve PrintObserver sınıfını tanımla
// Subject sınıfını tanımla

int main() {
    // Subject ve PrintObserver oluştur, attach et, notify çağır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <vector>
#include <string>

class Observer {
public:
    virtual ~Observer() = default;
    virtual void update(const std::string& msg) = 0;
};

class PrintObserver : public Observer {
public:
    void update(const std::string& msg) override {
        std::cout << msg;
    }
};

class Subject {
    std::vector<Observer*> observers;
public:
    void attach(Observer* o) { observers.push_back(o); }
    void notify(const std::string& msg) {
        for (Observer* o : observers) o->update(msg);
    }
};

int main() {
    Subject s;
    PrintObserver p;
    s.attach(&p);
    s.notify("Merhaba");
    return 0;
}

Beklenen çıktı

Merhaba

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Parçayı rolüne eşle

Kavram Anlamı
class Observer Soyut gözlemci
class Subject Haber veren
attach(o) Gözlemci ekler
notify(msg) Tüm gözlemcilere haber verir

2 notify çağrısını tamamla

Soru
subject.____("Merhaba");
Cevap
subject.notify("Merhaba");

Açıklama: notify tüm gözlemcilere haber verir.

3 notify(msg) metodu ne yapar?

  • Listeyi boşaltır
  • Her gözlemcinin update'ini çağırır Doğru cevap
  • Subject'in durumunu değiştirir
  • Yeni gözlemci oluşturur

Açıklama: notify, listedeki her gözlemcinin update metodunu çağırır.

İleri seviye bölümündeki tüm dersler