Menu
CoddyTech

Pola Observer (Peristiwa)

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 54 dari 70.

Pola Observer membentuk hubungan satu-ke-banyak, ketika satu object (subjek) memberi tahu beberapa object yang bergantung padanya (pengamat) saat keadaannya berubah. Di C#, event menyediakan cara bawaan untuk menerapkan pola ini dengan elegan.

Pola ini melibatkan penerbit yang memicu peristiwa dan pelanggan yang meresponsnya. Berikut contoh praktis pemantau harga saham:

public class Stock
{
    private decimal _price;
    
    public event Action<decimal> PriceChanged;
    
    public decimal Price
    {
        get => _price;
        set
        {
            _price = value;
            PriceChanged?.Invoke(_price);  // Beri tahu semua pengamat
        }
    }
}

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}");
    }
}

Subscriber memasang method mereka ke event menggunakan += dan dapat melepasnya dengan -=:

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

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

stock.Price = 150.50m;
// output:
// Alert: Price is now 150.50
// Logged: 150.50

stock.PriceChanged -= logger.OnPriceChanged;  // Berhenti berlangganan
stock.Price = 155.00m;
// output: Alert: Price is now 155.00

Pola Observer mendorong kopling longgar, class Stock tidak perlu mengetahui apa pun tentang para pengamatnya. Pengamat baru dapat berlangganan tanpa mengubah penerbit, sehingga sistem mudah diperluas dan dipelihara.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem pemantauan suhu menggunakan pola Observer dengan event. Kamu akan membuat sensor yang memberi tahu beberapa observer setiap kali suhu berubah, cocok untuk situasi seperti sistem pengatur iklim, ketika komponen yang berbeda perlu bereaksi terhadap pembaruan suhu.

Kamu akan mengatur kodemu dalam tiga file:

  • TemperatureSensor.cs: Buat class TemperatureSensor di namespace Monitoring. Ini adalah publisher-mu, yaitu subject yang akan diamati oleh object lain. Sensor-mu harus memiliki:
    • Field private untuk menyimpan suhu saat ini
    • Event bernama TemperatureChanged yang menggunakan Action<double> untuk memberi tahu subscriber tentang suhu baru
    • Property Temperature yang memicu event setiap kali suhu diatur ke nilai baru
  • Observers.cs: Buat dua class observer di namespace yang sama, yang akan berlangganan perubahan suhu:
    • DisplayUnit, memiliki method OnTemperatureChanged(double temp) yang mencetak Display: {temp}C
    • AlarmSystem, memiliki method OnTemperatureChanged(double temp) yang mencetak Alarm Check: {temp}C
  • Program.cs: Satukan semuanya dengan membuat sensor dan kedua observer. Jadikan kedua observer berlangganan ke event sensor, lalu perbarui suhunya. Setelah itu, hentikan langganan sistem alarm dan perbarui suhu lagi untuk menunjukkan bahwa hanya unit display yang menerima pemberitahuan.

Kamu akan menerima dua input:

  • Pembacaan suhu pertama (misalnya, 22.5)
  • Pembacaan suhu kedua (misalnya, 28.0)

Programmu harus:

  1. Membuat sensor dan kedua observer
  2. Menjadikan kedua observer berlangganan ke event TemperatureChanged
  3. Mengatur suhu sensor ke nilai input pertama (kedua observer harus diberi tahu)
  4. Menghentikan langganan AlarmSystem dari event
  5. Mengatur suhu sensor ke nilai input kedua (hanya display yang harus diberi tahu)

Misalnya, jika inputnya adalah 22.5 dan 28.0, outputnya harus berupa:

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

Ini menunjukkan keunggulan utama pola Observer. Sensor tidak tahu atau peduli siapa yang mendengarkannya. Observer dapat berlangganan dan berhenti berlangganan secara dinamis, sementara publisher cukup memberi tahu siapa pun yang sedang mendengarkan!

Coba sendiri

using System;
using Monitoring;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input suhu
        double temp1 = Convert.ToDouble(Console.ReadLine());
        double temp2 = Convert.ToDouble(Console.ReadLine());

        // TODO: Buat instance TemperatureSensor

        // TODO: Buat instance DisplayUnit dan AlarmSystem

        // TODO: Daftarkan kedua pengamat ke event TemperatureChanged

        // TODO: Atur suhu sensor ke temp1 (kedua pengamat menerima notifikasi)

        // TODO: Hapus langganan AlarmSystem dari event

        // TODO: Atur suhu sensor ke temp2 (hanya tampilan yang menerima notifikasi)
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online