public class PesanInversi {
    public static void main(String[] args) {
        LayananPesanan viaSms = new LayananPesanan(new PengirimSms());
        LayananPesanan viaEmail = new LayananPesanan(new PengirimEmail());

        viaSms.antar("Budi", "Pesanan #123 sudah dikirim");
        viaEmail.antar("Siti", "Pesanan #124 sedang diproses");
    }
}

// Abstraksi milik domain, bukan milik infrastruktur
interface PengirimPesan {
    void kirim(String penerima, String isi);
}

// Modul tingkat tinggi: hanya mengenal interface
class LayananPesanan {
    private final PengirimPesan pengirim;

    LayananPesanan(PengirimPesan pengirim) {
        this.pengirim = pengirim;
    }

    void antar(String pelanggan, String isi) {
        System.out.println("Layanan memproses pesanan untuk " + pelanggan);
        pengirim.kirim(pelanggan, isi);
    }
}

// Infrastruktur A: kanal SMS
class PengirimSms implements PengirimPesan {
    public void kirim(String penerima, String isi) {
        System.out.println("[SMS] Kepada " + penerima + ": " + isi);
    }
}

// Infrastruktur B: kanal email
class PengirimEmail implements PengirimPesan {
    public void kirim(String penerima, String isi) {
        System.out.println("[Email] Kepada " + penerima + "@example.com: " + isi);
    }
}
