Menu
Coddy logo textTech

Observer Kalıbı (Olaylar)

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 54 / 70.

Observer deseni, bir nesnenin (konu) durumu değiştiğinde birden fazla bağımlı nesneyi (gözlemciler) bilgilendirdiği bire-çok bir ilişki kurar. C#'ta olaylar (events), bu deseni zarif bir şekilde uygulamak için yerleşik bir yol sağlar.

Bu desen, olayları tetikleyen bir yayıncıyı ve bunlara yanıt veren aboneleri içerir. İşte bir hisse senedi fiyat monitörüne dair pratik bir örnek:

public class Stock
{
    private decimal _price;
    
    public event Action<decimal> PriceChanged;
    
    public decimal Price
    {
        get => _price;
        set
        {
            _price = value;
            PriceChanged?.Invoke(_price);  // Tüm gözlemcileri bilgilendir
        }
    }
}

public class PriceAlert
{
    public void OnPriceChanged(decimal newPrice)
    {
        Console.WriteLine($"Alert: Price is now {newPrice}");
    }
}

public class PriceLogger
{
    public void OnPriceChanged(decimal newPrice)
    {
        Console.WriteLine($"Logged: {newPrice}");
    }
}

Aboneler, metotlarını += kullanarak olaya bağlarlar ve -= ile ayırabilirler:

var stock = new Stock();
var alert = new PriceAlert();
var logger = new PriceLogger();

stock.PriceChanged += alert.OnPriceChanged;
stock.PriceChanged += logger.OnPriceChanged;

stock.Price = 150.50m;
// Çıktı:
// Uyarı: Fiyat artık 150.50
// Günlüğe kaydedildi: 150.50

stock.PriceChanged -= logger.OnPriceChanged;  // Abonelikten ayrıl
stock.Price = 155.00m;
// Çıktı: Uyarı: Fiyat artık 155.00

Observer deseni gevşek bağlılığı teşvik eder - Stock sınıfının gözlemcileri hakkında hiçbir şey bilmesine gerek yoktur. Yeni gözlemciler, yayıncıyı değiştirmeden abone olabilir, bu da sistemi genişletmeyi ve bakımını yapmayı kolaylaştırır.

challenge icon

Görev

Kolay

Olaylarla Observer desenini kullanarak bir sıcaklık izleme sistemi oluşturalım. Sıcaklık her değiştiğinde birden fazla gözlemciye bildirim gönderen bir sensör oluşturacaksın — farklı bileşenlerin sıcaklık güncellemelerine tepki vermesi gereken iklim kontrol sistemleri gibi senaryolar için mükemmel.

Kodunu üç dosyaya ayıracaksın:

  • TemperatureSensor.cs: TemperatureSensor ad alanında bir Monitoring sınıfı oluştur. Bu, yayıncındır — diğer nesnelerin gözlemleyeceği konu. Sensörün şunlara sahip olmalı:
    • Mevcut sıcaklığı depolamak için özel bir alan
    • Abonelere yeni sıcaklığı bildirmek için TemperatureChanged kullanan Action<double> adlı bir olay
    • Sıcaklık yeni bir değere ayarlandığında olayı tetikleyen bir Temperature özelliği
  • Observers.cs: Sıcaklık değişikliklerine abone olacak, aynı ad alanında iki gözlemci sınıfı oluştur:
    • DisplayUnitOnTemperatureChanged(double temp) yazdıran Display: {temp}C metoduna sahiptir
    • AlarmSystemOnTemperatureChanged(double temp) yazdıran Alarm Check: {temp}C metoduna sahiptir
  • Program.cs: Bir sensör ve her iki gözlemciyi oluşturarak her şeyi bir araya getir. Her iki gözlemciyi sensörün olayına abone et, ardından sıcaklığı güncelle. Bundan sonra alarm sisteminin aboneliğini kaldır ve yalnızca görüntüleme biriminin bildirimi aldığını göstermek için sıcaklığı tekrar güncelle.

İki girdi alacaksın:

  • İlk sıcaklık değeri (ör. 22.5)
  • İkinci sıcaklık değeri (ör. 28.0)

Programın şunları yapmalı:

  1. Sensörü ve her iki gözlemciyi oluştur
  2. Her iki gözlemciyi TemperatureChanged olayına abone et
  3. Sensörün sıcaklığını ilk girdi değerine ayarla (her iki gözlemciye de bildirim gönderilmeli)
  4. AlarmSystem aboneliğini olaydan kaldır
  5. Sensörün sıcaklığını ikinci girdi değerine ayarla (yalnızca görüntüleme birimine bildirim gönderilmeli)

Örneğin girdiler 22.5 ve 28.0 ise çıktı şöyle olmalı:

Display: 22.5C
Alarm Check: 22.5C
Display: 28C

Bu, Observer deseninin temel gücünü gösterir — sensör, onu kimin dinlediğini bilmez veya önemsemez. Gözlemciler dinamik olarak abone olabilir ve abonelikten çıkabilir; yayıncı da yalnızca o anda dinleyen kişilere bildirim gönderir!

Kendin dene

using System;
using Monitoring;

class Program
{
    public static void Main(string[] args)
    {
        // Giriş sıcaklıklarını oku
        double temp1 = Convert.ToDouble(Console.ReadLine());
        double temp2 = Convert.ToDouble(Console.ReadLine());

        // YAPILACAK: Bir TemperatureSensor örneği oluşturun

        // YAPILACAK: DisplayUnit ve AlarmSystem örneklerini oluşturun

        // YAPILACAK: Her iki gözlemciyi de TemperatureChanged olayına abone yapın

        // YAPILACAK: Sensörün sıcaklığını temp1 olarak ayarlayın (her iki gözlemciye de bildirim gider)

        // YAPILACAK: AlarmSystem'in olay aboneliğini iptal edin

        // YAPILACAK: Sensörün sıcaklığını temp2 olarak ayarlayın (yalnızca ekran birimine bildirim gider)
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C# derleyicisi