Observer
- C++ kursu
- İleri seviye
- Ders 34/83
- 5 dk
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
#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
#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
subject.____("Merhaba");
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.