CodeBlanks Logo Icon CodeBlanks

Observer deseni

JavaScript kursu · Uzman · Ders 4/63

Bir konunun birden fazla gözlemciyi haberdar etmesi desenini öğrenirsin.

Observer deseni

Observer deseni, bir konunun (subject) birden fazla gözlemciyi (observer) haberdar etmesini sağlar. Bir durum değiştiğinde konu tüm abonelere olay yayar.

JavaScript'te olaylar bu modele dayanır: addEventListener abone olur, olay gerçekleşince tarayıcı aboneleri çağırır.

Kendi EventEmitter sınıfımızı yazarak aynı modeli uygulayabiliriz: on abone ekler, emit olay yayınlar.

EventEmitter uygulaması

EventEmitter sınıfı, olay adlarını dizilere eşleyen bir listeners nesnesi tutar. on(event, callback) ilgili dizinin sonuna callback'i ekler.

emit(event, data) ise o olaya abone olan tüm callback'leri sırayla data argümanıyla çağırır.

emitter.on('login', cb);
emitter.emit('login', user);

Bu yapı, modern kütüphanelerin çoğunun temelidir.

Uygulama EventEmitter sınıfı

Bir EventEmitter sınıfı tanımla. Yapıcısı this.listeners özelliğini boş nesne {} yapar. on(event, callback) yöntemi, this.listeners[event] dizisine callback'i ekler (dizi yoksa önce boş dizi ata). emit(event, data) yöntemi, o olaya abone olan tüm callback'leri data ile çağırır.

Örnek çözümü göster
class EventEmitter ile başla, yapıcıda this.listeners = {} yap, on(event, callback) içinde this.listeners[event].push(callback) çağır, emit(event, data) içinde aboneleri cb(data) ile çağır.
Örnek çözüm:
class EventEmitter {
  constructor() {
    this.listeners = {};
  }
  on(event, callback) {
    if (!this.listeners[event]) {
      this.listeners[event] = [];
    }
    this.listeners[event].push(callback);
  }
  emit(event, data) {
    if (this.listeners[event]) {
      for (const cb of this.listeners[event]) {
        cb(data);
      }
    }
  }
}

Kendini test et

  1. Observer deseninde 'emit' ne yapar?

    • Yeni nesne üretir
    • Abone listesini temizler
    • Sınıfı gizler
    • Bir olayı tüm abonelere bildirir
    Cevabı göster

    Bir olayı tüm abonelere bildirir — Doğru! emit, kayıtlı tüm callback'leri olay verisiyle çağırır.

  2. Abone eklemeyi tamamla

    class EventEmitter {
      on(event, callback) {
        this.listeners[event].____(callback);
      }
    }
    Cevabı göster
    class EventEmitter {
      on(event, callback) {
        this.listeners[event].push(callback);
      }
    }
  3. Observer kavramlarını eşleştir

    Subject
    Olay kaynağı
    Observer
    Olay dinleyici
    on(event, cb)
    Abonelik ekleme
    emit(event, data)
    Olay yayınlama

Uzman bölümündeki tüm dersler