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 #

csharp
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:

text
Sistem menerima pesanan INV-303
Email konfirmasi INV-303 dikirim ke Budi
Pesanan INV-303 masuk laporan harian

Bedah Kode Baris per Baris #

Mari kita telaah kode di atas:

  1. Baris 3: Publisher mendeklarasikan event PesananBaru. Class ini tidak memuat referensi ke NotifikasiEmail maupun PencatatLaporan.
  2. Baris 7-8: Method Terima mencatat pesanan lalu memicu event, sehingga seluruh handler berjalan tepat setelah pesanan diterima.
  3. Baris 12-19: Kedua subscriber berdiri sendiri. Keduanya hanya menyediakan method dengan signature yang cocok, tanpa tahu siapa penerbitnya.
  4. Baris 28-29: Method group email.Kirim dan laporan.Catat didaftarkan lewat +=. Urutan pendaftaran menentukan urutan eksekusi handler.
  5. Baris 31: Satu pemanggilan Terima menghasilkan 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.