Observer Deseni
- İngilizcesi
- Observer Pattern
- Türkçe karşılığı
- gözlemci deseni
- Okunuşu
- ıbzörvır petırn
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Observer deseni, subject adlı bir nesnenin durumu değiştiğinde abone listesini otomatik olarak bilgilendirdiği davranışsal bir tasarım desenidir.
Observer deseni nedir?
Observer deseni, nesneler arasında bire-çok bir ilişki tanımlar. Subject adı verilen bir nesne, ilgilenen nesnelerin (observer) listesini tutar ve verisinin değişmesi gibi bir şey olduğunda her birini çağırır. Observer'lar istedikleri zaman abone olup ayrılabilir; subject'in onlar hakkında, onları nasıl bilgilendireceği dışında hiçbir şey bilmesi gerekmez.
Uygulamada subject, subscribe ve unsubscribe gibi metotlar sunar ve kayıtlı her callback'i bir notify adımında çağırır. Web geliştiricileri bu deseni sürekli kullanır: DOM'daki addEventListener, Node.js'teki event emitter'lar ve arayüz framework'lerindeki reaktif durum hep bunu izler. Bir düğmeye tıklandığında ya da saklanan bir değer değiştiğinde kayıtlı her dinleyici çalışır.
Bülten iyi bir benzetmedir: okurlar abone olur, yayıncı her yeni sayıyı listedeki herkese gönderir ve okurlar istedikleri zaman abonelikten çıkabilir. Yayıncının okurların kim olduğunu ya da sayıyla ne yaptıklarını bilmesi gerekmez. Bu gevşek bağlılık, bir olaya yeni tepkiler eklemenizi, olayı tetikleyen kodu değiştirmeden mümkün kılar.
Observer deseni sıklıkla publish-subscribe (yayınla-abone ol) ile karıştırılır. Observer deseninde observer'lar doğrudan subject'e kaydolur ve bildirim genellikle tek bir program içinde eşzamanlı gerçekleşir; publish-subscribe'da ise yayıncılar ve aboneler birbirini tanımaz ve çoğunlukla servisler arasında, ayrı bir aracı (broker) ya da mesaj kuyruğu üzerinden iletişim kurar. Sık yapılan bir hata abonelikten çıkmayı unutmaktır; bu, kullanılmayan nesneleri bellekte tutar ve bellek sızıntılarına yol açar.
Önemli noktalar
- Subject, durumu değiştiğinde kayıtlı tüm observer'larını bilgilendirir.
- Observer'lar çalışma zamanında abone olup ayrılabilir.
- Bir olayı tetikleyen kod ile ona tepki veren kodu birbirinden ayırır.
- DOM olay dinleyicileri ve Node.js event emitter'lar gündelik örneklerdir.
- Bellek sızıntılarını önlemek için artık gerekmeyen observer'ların aboneliğini iptal edin.
Örnek
class Subject {
observers = [];
subscribe(observer) {
this.observers.push(observer);
return () => (this.observers = this.observers.filter((o) => o !== observer));
}
notify(value) {
this.observers.forEach((observer) => observer(value));
}
}
const price = new Subject();
const unsubscribe = price.subscribe((p) => console.log("New price:", p));
price.notify(42); // New price: 42
unsubscribe(); // stop listening when no longer neededSık sorulan sorular
Observer deseni ile publish-subscribe arasındaki fark nedir?
Observer deseninde observer'lar, kendilerini bilgilendiren subject'e doğrudan abone olur. Publish-subscribe'da araya bir aracı ya da olay kanalı girer; böylece yayıncılar ve aboneler birbirine hiç referans vermez, bu da ayrı servisler arası iletişime uygundur.
Observer deseni nerelerde kullanılır?
DOM olay dinleyicilerinde, Node.js event emitter'larında, reaktif arayüz durum yönetiminde, diğer hücreler değişince güncellenen hesap tablosu hücrelerinde ve bir programın birkaç bölümünün aynı olaya tepki vermesi gereken her yerde kullanılır.
Observer deseninin dezavantajları nelerdir?
Aboneliği hiç iptal edilmeyen observer'lar bellek sızıntılarına yol açabilir ve uzun bildirim zincirleri programın akışını takip etmeyi ve hata ayıklamayı zorlaştırabilir. Observer'ların çalışma sırası da genellikle garanti edilmez.
İlgili sayfalar
- Tasarım DeseniYazılım Mimarisi, s. 42Tasarım deseni, yazılım tasarımında sık görülen bir soruna kanıtlanmış, yeniden kullanılabilir çözümdür; hazır kod değil, genel bir şablon olarak anlatılır.
- Olay Güdümlü MimariYazılım Mimarisi, s. 29Olay güdümlü mimari, servislerin bir siparişin verilmesi gibi olaylar üreterek ve bunlara tepki vererek iletişim kurduğu bir yazılım tasarım tarzıdır.
- CallbackProgramlamanın Temelleri, s. 5Callback, başka bir fonksiyona argüman olarak verilen ve o fonksiyonun bir iş bittiğinde ya da bir olay gerçekleştiğinde sonradan çağırdığı fonksiyondur.
- DOMWeb Geliştirme, s. 14DOM, tarayıcının bir web sayfasını temsil eden ve JavaScript'in okuyup değiştirerek kullanıcının gördüğünü güncelleyebildiği bellek içi nesne ağacıdır.
- Mesaj KuyruğuBackend ve API'ler, s. 28Mesaj kuyruğu, bir servisten gelen mesajları bir başkası işlemeye hazır olana kadar saklayan ve sistemin parçalarını eşzamansız çalıştıran bir bileşendir.
- MVCYazılım Mimarisi, s. 26MVC, uygulamayı veri ve mantık için Model, gösterim için View ve kullanıcı girdisini yöneten Controller olmak üzere üçe ayıran bir mimari desendir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin