Programlamada Tasarım Desenleri #14 —Observer Design Pattern (dotnet c#)

Programlamada Tasarım Desenleri #14 — Observer Design Pattern (C# .NET)

Modern yazılım geliştirme dünyasında Tasarım Desenleri (Design Patterns), sürdürülebilir ve ölçeklenebilir kod yazmanın temel taşlarındandır. Bu yazımızda “Observer Design Pattern” yani “Gözlemci Tasarım Deseni“ni inceliyor olacağız. Örnekleri .NET / C# ile destekleyerek gerçek dünya senaryolarında nasıl kullanıldığını anlayacağız.

🚀 SEO İçin Anahtar Kelimeler: Observer Design Pattern, Gözlemci Tasarım Deseni, .NET C#, C# Tasarım Desenleri, Design Patterns in C#, Yazılım Mimarisi


Observer Design Pattern Nedir?

Observer Pattern, bir nesnedeki (Subject) durum değişikliğinin, ona abone olan (Observer) diğer nesneler tarafından otomatik olarak algılanmasını sağlar. Yani bir “Publisher-Subscriber” ilişkisi kurar.

Bu desenin temel amacı bağımlılıkları azaltmak ve olay odaklı bir yapı inşa etmektir.

🧠 Ne zaman kullanılmalı?

  • Bir nesnedeki değişikliklerin, birden fazla nesne tarafından izlenmesi gerekiyorsa.
  • Modüler, loosely coupled (gevşek bağlı) bir mimari istiyorsanız.
  • Event-driven (olay tabanlı) sistemler geliştiriyorsanız.

Observer Design Pattern’in Mimarisi

Observer Design Pattern UML Diyagramı

Temel Bileşenleri:

  • ISubject (Konu): Gözlemcileri kayıt eden, silen ve bilgilendiren arabirim.
  • IObserver (Gözlemci): Konudan gelen bildirimleri alan arabirim.
  • ConcreteSubject: Durumu değiştiğinde gözlemcileri bilgilendiren sınıf.
  • ConcreteObserver: Bildirimi alıp ilgili işlemi yapan sınıf.

C# .NET ile Observer Pattern Uygulaması

Aşağıda, Observer Pattern’i .NET 6 ile nasıl uygulayabileceğimizi adım adım gösteriyoruz.

1. IObserver ve ISubject Arayüzlerini Tanımlayalım

public interface IObserver
{
    void Update(string message);
}

public interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify(string message);
}

2. ConcreteSubject Sınıfı

public class NotificationService : ISubject
{
    private List _observers = new();

    public void Attach(IObserver observer)
    {
        _observers.Add(observer);
    }

    public void Detach(IObserver observer)
    {
        _observers.Remove(observer);
    }

    public void Notify(string message)
    {
        foreach (var observer in _observers)
        {
            observer.Update(message);
        }
    }

    // Örnek: Yeni bildirim geldiğinde çağrılacak metod
    public void NewNotification(string notification)
    {
        Console.WriteLine($"[System] Yeni bildirim: {notification}");
        Notify(notification);
    }
}

3. ConcreteObserver Sınıfları

public class EmailClient : IObserver
{
    public void Update(string message)
    {
        Console.WriteLine($"📧 Email Client: Yeni mesaj '{message}' alındı.");
    }
}

public class SmsClient : IObserver
{
    public void Update(string message)
    {
        Console.WriteLine($"📱 SMS Client: Yeni mesaj '{message}' alındı.");
    }
}

4. Uygulama: Observer Pattern Kullanımı

class Program
{
    static void Main()
    {
        var notificationService = new NotificationService();

        var emailClient = new EmailClient();
        var smsClient = new SmsClient();

        // Observer’ları kaydet
        notificationService.Attach(emailClient);
        notificationService.Attach(smsClient);

        // Yeni bildirim gönder
        notificationService.NewNotification("Yeni sipariş alındı!");

        // Sms client artık takip etmiyor
        notificationService.Detach(smsClient);

        notificationService.NewNotification("Kargo yola çıktı!");
    }
}

🔍 Konsol Çıktısı:

[System] Yeni bildirim: Yeni sipariş alındı!
📧 Email Client: Yeni mesaj 'Yeni sipariş alındı!' alındı.
📱 SMS Client: Yeni mesaj 'Yeni sipariş alındı!' alındı.
[System] Yeni bildirim: Kargo yola çıktı!
📧 Email Client: Yeni mesaj 'Kargo yola çıktı!' alındı.

Observer Pattern’in Avantajları

  • Gevşek bağlı (Loosely coupled) yapı sağlar.
  • ✅ Tek bir nesnedeki değişim, diğerleri ile otomatik senkronize edilir.
  • OOP prensiplerine uygundur, özellikle “Açık- Kapalı Prensibi (Open/Closed Principle)”.

Dezavantajları

  • ⚠️ Çok sayıda gözlemci olduğunda, performans etkilenebilir.
  • ⚠️ Karmaşık yapılar, debug işlemini zorlaştırabilir.

Gerçek Hayatta Observer Pattern Kullanım Örnekleri

  • GUI Frameworkleri: Butona tıklama, formun yüklenmesi vb. olayların izlenmesi.
  • Event Aggregator Pattern ile kullanılarak, uygulama genelinde modüller arası loosely bağlı iletişim.
  • Logging, Notification, Messaging Sistemleri
  • Dependency Injection Container’larındaki event’ler

.NET’in Kendi Olay (Event) Sistemi ile Observer Pattern

.NET içerisinde native olarak observer benzeri bir yapı için olay (event) kavramı mevcuttur. Örnek olarak:

public class Publisher
{
    public event EventHandler<EventArgs> Notified;

    public void RaiseEvent()
    {
        Notified?.Invoke(this, EventArgs.Empty);
    }
}

Bu yapılar aslında Observer Pattern’in uygulanmış halidir.


Sonuç: Observer Design Pattern ile Esnek ve Dinamik Uygulamalar Kurun

Observer Pattern, özellikle modüler ve dinamik uygulamalar için büyük kolaylık sağlar. C# gibi güçlü bir programlama dilinde bu deseni uygulamak oldukça basittir ve etkin sonuçlar verir. Olay tabanlı sistemler kurarken bu deseni mutlaka değerlendirin.


🎁 İpucu: Reactive Extensions (Rx.NET)

C# ekosisteminde Rx.NET (Reactive Extensions) kütüphanesi, Observer Pattern’i daha soyut ve reaktif bir şekilde uygular. Veri akışlarına abone olmak ve gelen olayları filtrelemek için ideal bir araçtır.


📷 Görsel Önerileri:

  • Observer Design Pattern UML diyagramı
  • Akış şeması (Subject → Observer 1, Observer 2)
  • Kod diyagramı (dotnet ile kod bloğunun gösterimi)

🔗 Daha Fazla Okuma:


📝 Siz de bir Observer Pattern örneği mi geliştirdiniz? Yorumlarda paylaşın!

📩 Yeni yazılardan haberdar olmak için abone olmayı unutmayın.


☕️ Etiketler: observer pattern, design patterns c#, c# observer, .net events, gözlemci tasarım deseni, c# tasarım desenleri, yazılım mimarisi

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir