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

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