Design Pattern: Proxy pattern

Nov 27, 2025

Proxy pattern adalah salah satu structural design pattern yang menyediakan pengganti atau tempat penampung bagi objek lain. Proxy pattern ini bisa dibilang bertugas untuk mengontrol objek originalnya, yang memungkinkan kita menambahkan fungsional seperti lazy initialization, control access, logging dan caching pada saat sebelum atau sesudah request kepada object originalnya. Proxy pattern biasanya sering digunakan framework seperti Spring atau mockito untuk menambahkan behaviour khusus kepada object milik kita.

Komponen Proxy pattern

  1. Subject (interface) : adalah interface atau kelas abstrak yang mendefinisikan operasi yang dilakukan real subject. Ini memastikan bahwa Proxy dapat digunakan di mana pun Real Subject diharapkan.

  2. Real Subject : adalah object yang sebenarnya, yang berisi implementasi logika bisnis.

  3. Proxy : Kelas Proxy memiliki referensi ke Real Subject. Ia mengimplementasikan Subject Interface dan setelah menerima permintaan dari klien, ia dapat melakukan sesuatu sebelum/sesudah meneruskan permintaan ke Real Subject.

Contoh Kasus: lazy initialization

Misalnya kita punya skenario dimana aplikasi kita butuh me-load dan display gambar yang berat, dan kita ingin mengoptimalisasi dalam loading process-nya

Interface

public interface Image {
    void display();
}

Real Subject

public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk(); // loading yang berat
    }

    private void loadFromDisk() {
        System.out.println("Loading " + filename);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + filename);
    }
}

Bisa dilihat contoh kode di atas, kita punya object RealImage dengan loading yang berat pada saat initialisasi. Kita ingin mengoptimasi loading prosesnya dimana load image hanya dilakukan ketika gambarnya akan di-display saja, mungkin kamu berpikir “kalo gitu tinggal pindahkan saja loadFromDisk() ke method display()” iya kalo object ini milik kita, kalo ini milik orang lain (library) yang kita tidak punya akses untuk mengubahnya?. Inilah salah satu manfaat dari proxy pattern, kita bisa menambahkan behaviour kepada object milik orang lain.

Proxy

public class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename); // dibuat hanya ketika diperlukan
        }
        realImage.display();
    }
}

Dengan proxy, kita membungkus original object-nya agar tidak langsung me-load image lewat instansiasi original object, tetapi menunda-nya sampai display dipanggil saat pertama kali. Penggunannya sebagai berikut.

Image image = new ProxyImage("filename.jpg");
// load belum dilakukan
img.display();  
// loading terjadi di sini

// kedua kali display tanpa loading
img.display();

Kapan harus menggunakan proxy pattern

  1. Mengimplementasikan lazy loading, menunda pembuatan object yang berat sebelum ia digunakan.

  2. Mengontrol akses, memeriksa ijin sebelum objek asli diakses.

  3. Menambahkan fungsionalitas tambahan seperti caching, logging atau monitoring tanpa mengubah isi objek aslinya

  4. Remote proxy, merepresentasikan objek yang berada di server lain.

Konklusi

Proxy pattern adalah objek pembungkus atau pengganti untuk objek lain. Proxy pattern cocok digunakan jika kita ingin menambah fungsional tambahan pada objek yang kita tidak bisa ubah isinya, mengontrol akses, ataupun merepresentasikan objek yang ada di server lain.