CodeBlanks Logo Icon CodeBlanks

Observer

C# kursu · İleri seviye · Ders 64/83

Observer deseniyle olay tabanlı bildirim öğrenirsin.

Observer deseni

Observer, bir nesnenin (Subject) durumu değiştiğinde ona abone olan diğer nesnelere (Observer) haber verilmesini sağlar. C#'ta bu, event anahtar kelimesi ve EventHandler<T> temsilcisiyle doğal biçimde yapılır.

Örnek: Stock sınıfı fiyat değişiminde PriceChanged olayını fırlatır. StockMonitor bu olaya abone olur ve fiyat değişince ekrana yazar. Subject observer'ları tanımak zorunda değildir; yalnızca olayı ateşler.

event ve EventHandler<T>

C#'ta event anahtar kelimesi, bir temsilcinin yalnızca tanımlayıcı sınıf içinden çağrılabilmesini sağlar. Dışarıdaki kod yalnızca += ile abone olur ya da -= ile aboneliği kaldırır. EventHandler<T> genel imzayı (gönderen ve olay verisi) standart hale getirir.

Özellik tetikleyici olarak kullanılır: set bloğu yeni değeri saklar, ardından PriceChanged?.Invoke(this, value) ile olayı ateşler. ?. abone yoksa çağrıyı atlar.

Uygulama Stock ve StockMonitor oluştur

class Stock tanımla. Symbol özelliği kurucudan gelsin. Price özelliğinin set bloğu yeni değeri saklayıp PriceChanged?.Invoke(this, value) ile olayı ateşlesin. public event EventHandler<decimal> PriceChanged olayı tanımla. class StockMonitor kurucusunda bir Stock alıp PriceChanged olayına lambda ile abone olsun ve Console.WriteLine ile "{symbol}: {price}" yazsın. Main'de Stock("ACME") yarat, monitörü bağla ve Price = 150m yap.

Örnek çözümü göster
class Stock { public string Symbol { get; } public Stock(string s) => Symbol = s; private decimal _price; public decimal Price { get => _price; set { _price = value; PriceChanged?.Invoke(this, value); } } public event EventHandler<decimal> PriceChanged; } tanımla. StockMonitor kurucusunda stock.PriceChanged += (s, p) => Console.WriteLine($"{stock.Symbol}: {p}"); yaz. Main'de: var stock = new Stock("ACME"); var monitor = new StockMonitor(stock); stock.Price = 150m;
Örnek çözüm:
using System;

class Stock
{
    public string Symbol { get; }
    public Stock(string symbol) => Symbol = symbol;

    private decimal _price;
    public decimal Price
    {
        get => _price;
        set
        {
            _price = value;
            PriceChanged?.Invoke(this, value);
        }
    }

    public event EventHandler<decimal> PriceChanged;
}

class StockMonitor
{
    public StockMonitor(Stock stock)
    {
        stock.PriceChanged += (s, price) =>
            Console.WriteLine($"{stock.Symbol}: {price}");
    }
}

class Program
{
    static void Main()
    {
        var stock = new Stock("ACME");
        var monitor = new StockMonitor(stock);
        stock.Price = 150m;
    }
}

Kendini test et

  1. Observer terimlerini eşleştir

    Subject
    Bildirim kaynağı
    Observer
    Bildirim alan taraf
    Subscribe
    Gözlemciyi ekler
    Notify
    Tüm gözlemcilere haber verir
  2. Observer desende gözlemcinin (Observer) rolü nedir?

    • Subject değişince haber alır
    • Tek örnek oluşturur
    • Sınıfı mühürler
    • Nesne yaratmayı kolaylaştırır
    Cevabı göster

    Subject değişince haber alır — Doğru. Gözlemci, Subject'in değişim olayına abone olur ve haberi alır.

  3. Olay bildirimini tamamla

    public ____ EventHandler<decimal> PriceChanged;
    Cevabı göster
    public event EventHandler<decimal> PriceChanged;

İleri seviye bölümündeki tüm dersler