Observer Pattern ile Bildirim Mekanizması: Olaylara Abone Olmanın Gücü!
Merhaba sevgili okuyucular! Bugün sizlerle yazılım dünyasında sıkça karşılaştığımız ve uygulamalarımızı daha esnek, modüler ve genişletilebilir hale getirmemize yardımcı olan bir tasarım desenini inceleyeceğiz: Observer Pattern . Türkçesiyle “Gözlemci Deseni” olarak da bilinen bu desen, bir nesnenin (Subject) durumundaki değişiklikleri, ona bağımlı olan diğer nesnelere (Observers) otomatik olarak bildirme mekanizmasını tanımlar. Kulağa karmaşık geliyor olabilir, ancak endişelenmeyin, adım adım ve örneklerle konuyu açıklığa kavuşturacağız.
Observer Pattern Nedir ve Neden İhtiyaç Duyarız?
Günlük hayattan bir örnekle başlayalım: Bir YouTube kanalına abone olduğunuzu düşünün. Kanal sahibi yeni bir video yayınladığında, YouTube size bir bildirim gönderir. İşte bu senaryo, Observer Pattern’in temel çalışma prensibini yansıtır. Kanal sahibi (Subject), siz (Observer) ve YouTube’un bildirim sistemi de desenin bir parçasıdır.
Peki bu deseni neden kullanmalıyız?:
* Gevşek Bağlantı (Loose Coupling): Subject ve Observers arasındaki bağımlılığı azaltır. Subject, Observers’ın kim olduğunu veya ne yaptığını bilmek zorunda değildir. Bu, sistemin daha modüler ve bakımı kolay olmasını sağlar.
* Tek Sorumluluk Prensibi (Single Responsibility Principle): Subject, sadece kendi iş mantığına odaklanır. Bildirim gönderme sorumluluğu, Observer Pattern tarafından yönetilir.
* Açık/Kapalı Prensibi (Open/Closed Principle): Sisteme yeni Observers eklemek, mevcut Subject kodunu değiştirmeyi gerektirmez. Bu, sistemin kolayca genişletilebilir olmasını sağlar.
Observer Pattern Nasıl Çalışır?
Observer Pattern’in temelinde iki ana aktör bulunur:
* Subject (Gözlemlenen): Durumu değiştiğinde Observers’a bildirim gönderen nesnedir. Bir Observer listesi tutar ve bu listeye Observer ekleme/çıkarma metotlarına sahiptir.
* Observer (Gözlemci): Subject’in durumundaki değişikliklerden haberdar olmak isteyen nesnedir. Subject’e abone olur ve Subject’ten gelen bildirimleri alır.
İşleyiş şu şekildedir:
1. Observer, Subject’e abone olur (kendini ekler).
2. Subject’in durumu değişir.
3. Subject, abone olan tüm Observers’a bildirim gönderir.
4. Observers, bildirimi alır ve gerekli işlemleri gerçekleştirir.
Event Tabanlı Örneklerle Observer Pattern
Şimdi de Observer Pattern’i daha iyi anlamak için birkaç event tabanlı örnek inceleyelim. Bu örnekler, C# dilinde yazılmıştır ancak prensipler diğer dillerde de aynıdır.
Örnek 1: Hava Durumu Uygulaması
Bir hava durumu uygulaması geliştirdiğimizi varsayalım. Bu uygulamada, hava durumu verileri değiştiğinde, kullanıcı arayüzünü güncellemek, e-posta göndermek veya SMS göndermek gibi farklı işlemler yapmak isteyebiliriz.
“`csharp
// Subject (Gözlemlenen)
public class HavaDurumuMerkezi
{
private List _observers = new List();
private double _sicaklik;
public double Sicaklik
{
get { return _sicaklik; }
set
{
_sicaklik = value;
HaberVer();
}
}
public void AboneOl(IObserver observer)
{
_observers.Add(observer);
}
public void AboneliktenCik(IObserver observer)
{
_observers.Remove(observer);
}
private void HaberVer()
{
foreach (var observer in _observers)
{
observer.Guncelle(this);
}
}
}
// Observer (Gözlemci) Arayüzü
public interface IObserver
{
void Guncelle(HavaDurumuMerkezi havaDurumuMerkezi);
}
// Concrete Observer (Somut Gözlemci) – Kullanıcı Arayüzü
public class KullaniciArayuzu : IObserver
{
public void Guncelle(HavaDurumuMerkezi havaDurumuMerkezi)
{
Console.WriteLine($”Kullanıcı Arayüzü: Sıcaklık {havaDurumuMerkezi.Sicaklik} derece olarak güncellendi.”);
}
}
// Concrete Observer (Somut Gözlemci) – E-posta Servisi
public class EpostaServisi : IObserver
{
public void Guncelle(HavaDurumuMerkezi havaDurumuMerkezi)
{
Console.WriteLine($”E-posta Servisi: Sıcaklık {havaDurumuMerkezi.Sicaklik} derece olarak güncellendi. E-posta gönderiliyor…”);
// E-posta gönderme işlemleri
}
}
// Kullanım
public class Program
{
public static void Main(string[] args)
{
HavaDurumuMerkezi havaDurumuMerkezi = new HavaDurumuMerkezi();
KullaniciArayuzu kullaniciArayuzu = new KullaniciArayuzu();
EpostaServisi epostaServisi = new EpostaServisi();
havaDurumuMerkezi.AboneOl(kullaniciArayuzu);
havaDurumuMerkezi.AboneOl(epostaServisi);
havaDurumuMerkezi.Sicaklik = 25;
havaDurumuMerkezi.Sicaklik = 30;
havaDurumuMerkezi.AboneliktenCik(epostaServisi);
havaDurumuMerkezi.Sicaklik = 32;
}
}
“`
Bu örnekte, `HavaDurumuMerkezi` Subject’i, `KullaniciArayuzu` ve `EpostaServisi` ise Observers’ı temsil eder. Hava durumu verileri değiştiğinde, `HavaDurumuMerkezi`, abone olan tüm Observers’a bildirim gönderir ve onlar da kendi işlemlerini gerçekleştirir.
Observer Pattern, uygulamalarımızı daha esnek, modüler ve genişletilebilir hale getirmemize yardımcı olan güçlü bir tasarım desenidir. Özellikle event tabanlı sistemlerde, bir nesnenin durumundaki değişiklikleri diğer nesnelere bildirmek için ideal bir çözümdür.
Umarım bu yazı, Observer Pattern’i anlamanıza ve uygulamalarınızda kullanmanıza yardımcı olmuştur. Bir sonraki yazımızda görüşmek üzere!