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.00Pola 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.
Tantangan
MudahMari 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 classTemperatureSensordi namespaceMonitoring. 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
TemperatureChangedyang menggunakanAction<double>untuk memberi tahu subscriber tentang suhu baru - Property
Temperatureyang 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 methodOnTemperatureChanged(double temp)yang mencetakDisplay: {temp}CAlarmSystem, memiliki methodOnTemperatureChanged(double temp)yang mencetakAlarm 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:
- Membuat sensor dan kedua observer
- Menjadikan kedua observer berlangganan ke event
TemperatureChanged - Mengatur suhu sensor ke nilai input pertama (kedua observer harus diberi tahu)
- Menghentikan langganan
AlarmSystemdari event - 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: 28CIni 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)
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list10Pola Desain Bagian 1
Pengantar Pola DesainSingleton yang Aman untuk ThreadPola FactoryPola Observer (Peristiwa)Pola Strategy2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online