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 dependen (pengamat) saat keadaannya berubah. Di C#, events menyediakan cara bawaan untuk menerapkan pola ini dengan elegan.

Pola ini melibatkan publisher yang memicu event dan subscriber 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 menghubungkan method mereka ke event menggunakan += dan dapat melepaskannya 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:
// Peringatan: Harga sekarang 150.50
// Tercatat: 150.50

stock.PriceChanged -= logger.OnPriceChanged;  // Hentikan langganan
stock.Price = 155.00m;
// output: Peringatan: Harga sekarang 155.00

Pola Observer mendorong keterikatan yang longgar, class Stock tidak perlu mengetahui apa pun tentang observer-nya. Observer baru dapat berlangganan tanpa mengubah publisher, sehingga sistem mudah diperluas dan dipelihara.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pemantauan suhu menggunakan pola Observer dengan event. Kamu akan membuat sensor yang memberi tahu beberapa observer setiap kali suhu berubah. Ini cocok untuk skenario seperti sistem pengatur iklim, ketika komponen yang berbeda perlu merespons 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. Keduanya 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. Langganan kedua observer ke event sensor, lalu perbarui suhunya. Setelah itu, batalkan langganan sistem alarm dan perbarui suhu sekali 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. Melanggankan kedua observer ke event TemperatureChanged
  3. Mengatur suhu sensor ke nilai input pertama (kedua observer harus menerima pemberitahuan)
  4. Membatalkan langganan AlarmSystem dari event
  5. Mengatur suhu sensor ke nilai input kedua (hanya display yang harus menerima pemberitahuan)

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

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

Ini menunjukkan kekuatan utama pola Observer. Sensor tidak tahu atau peduli siapa yang mendengarkannya. Observer dapat berlangganan dan membatalkan langganan 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 pemberitahuan)

        // TODO: Hapus langganan AlarmSystem dari event

        // TODO: Atur suhu sensor ke temp2 (hanya tampilan yang menerima pemberitahuan)
    }
}
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