Cetakan struk, email konfirmasi, dan laporan harian biasanya berada di modul yang berbeda, padahal ketiganya bereaksi pada kejadian yang sama: pesanan baru diterima. Pola publisher-subscriber menyelesaikan persoalan ini. Class penerbit (publisher) hanya mendeklarasikan event; modul lain menjadi pelanggan (subscriber) yang mendaftar sendiri; publisher tidak menyebut nama satu pun dari mereka.
Peran dibagi tegas: publisher mendeklarasikan event dan memicunya di titik yang tepat; subscriber menyediakan method handler dan mendaftarkan diri; penghubung keduanya hanyalah signature method, bukan referensi class. Dengan pembagian itu, dua modul dapat dikompilasi tanpa saling memuat namespace, dan penggantian subscriber tidak menyentuh kode publisher.
Mendaftarkan Subscriber #
class SistemPesanan
{
public event Action<string> PesananBaru;
public void Terima(string nomor)
{
Console.WriteLine($"Sistem menerima pesanan {nomor}");
PesananBaru?.Invoke(nomor);
}
}
class NotifikasiEmail
{
public void Kirim(string nomor) =>
Console.WriteLine($"Email konfirmasi {nomor} dikirim ke Budi");
}
class PencatatLaporan
{
public void Catat(string nomor) =>
Console.WriteLine($"Pesanan {nomor} masuk laporan harian");
}
SistemPesanan sistem = new();
NotifikasiEmail email = new();
PencatatLaporan laporan = new();
sistem.PesananBaru += email.Kirim;
sistem.PesananBaru += laporan.Catat;
sistem.Terima("INV-303");Output yang Dihasilkan:
Sistem menerima pesanan INV-303
Email konfirmasi INV-303 dikirim ke Budi
Pesanan INV-303 masuk laporan harianBedah Kode Baris per Baris #
Mari kita telaah kode di atas:
- Baris 3: Publisher mendeklarasikan event
PesananBaru. Class ini tidak memuat referensi keNotifikasiEmailmaupunPencatatLaporan. - Baris 7-8: Method
Terimamencatat pesanan lalu memicu event, sehingga seluruh handler berjalan tepat setelah pesanan diterima. - Baris 12-19: Kedua subscriber berdiri sendiri. Keduanya hanya menyediakan method dengan signature yang cocok, tanpa tahu siapa penerbitnya.
- Baris 28-29: Method group
email.Kirimdanlaporan.Catatdidaftarkan lewat+=. Urutan pendaftaran menentukan urutan eksekusi handler. - Baris 31: Satu pemanggilan
Terimamenghasilkan tiga baris output: satu dari publisher dan dua dari subscriber.
Bila suatu saat modul inventaris juga perlu tahu pesanan baru, kita membuat class baru dengan method yang cocok, lalu menambah satu baris += di titik pendaftaran. Publisher SistemPesanan tidak berubah satu baris pun; skala keuntungan pola ini terasa justru ketika jumlah modul bertambah.