1. Apa itu Pola Proxy
Pola proxy adalah pola desain struktural yang bertindak sebagai proxy untuk mengontrol akses ke objek tertentu. Berdasarkan objek target (objek yang diproksikan), pola proxy menyediakan objek proxy melalui mana klien dapat mengakses objek target, memungkinkan fungsionalitas tambahan ditambahkan ke objek target.
1.1 Definisi Pola Proxy
Pola proxy adalah pola desain yang melibatkan kerjasama dari dua atau lebih objek. Satu objek adalah objek target aktual yang dipanggil, sementara satu atau lebih objek lain bertindak sebagai objek proxy. Objek-objek proxy menangkap akses ke objek target, menyediakan cara tidak langsung untuk mengakses objek target.
1.2 Tujuan dan Tujuan Pola Proxy
Tujuan utama dari pola proxy adalah untuk menyediakan cara tidak langsung untuk mengakses objek target, memungkinkan fungsionalitas tambahan ditambahkan ke objek target. Objek-objek proxy dapat menangani logika umum, seperti pengendalian akses ke objek target, caching, dan logging. Pola proxy juga dapat menerapkan lazy loading, menginstansiasi objek target hanya saat dibutuhkan.
2. Karakteristik dan Keunggulan Pola Proxy
Pola proxy memiliki karakteristik dan keunggulan berikut:
- Dapat memperluas fungsionalitas objek target tanpa memodifikasinya.
- Dapat mengendalikan akses ke objek target melalui objek proxy.
- Dapat melakukan operasi tambahan sebelum atau setelah mengakses objek target.
- Dapat menerapkan lazy loading, menginstansiasi objek target hanya saat dibutuhkan.
3. Contoh Penerapan Praktis dari Pola Proxy
Pola proxy banyak digunakan dalam berbagai skenario aplikasi. Berikut adalah beberapa contoh umum penerapan praktis:
- Remote Proxy: Digunakan untuk mengakses objek di jaringan secara lokal.
- Virtual Proxy: Digunakan untuk membuat objek mahal sesuai kebutuhan.
- Security Proxy: Digunakan untuk mengontrol akses ke objek.
- Smart Reference: Digunakan untuk melakukan operasi tambahan saat mengakses objek, seperti penghitungan objek.
4.1 Diagram Kelas UML
Berikut adalah diagram kelas UML dari Pola Proxy dalam Golang:
4.2 Pengantar Contoh
Misalkan kita memiliki sebuah interface Subject
yang mendefinisikan metode Request
. Kita memiliki sebuah kelas implementasi konkret RealSubject
, yang mengimplementasikan interface Subject
. Kemudian kita membuat kelas proxy Proxy
, yang menyimpan objek RealSubject
dan juga mengimplementasikan interface Subject
. Pada metode Request
dari kelas Proxy
, kita dapat melakukan operasi tambahan sebelum atau setelah memanggil metode Request
dari RealSubject
.
4.3 Langkah Implementasi 1: Mendefinisikan Interface Proxy
Pertama, kita perlu mendefinisikan interface Subject
yang berisi metode Request
:
package main
type Subject interface {
Request()
}
4.4 Langkah Implementasi 2: Mengimplementasikan Objek Target
Selanjutnya, kita mengimplementasikan objek target spesifik RealSubject
, yang mengimplementasikan interface Subject
:
package main
import "fmt"
type RealSubject struct {}
func (r *RealSubject) Request() {
fmt.Println("RealSubject: Menangani Permintaan")
}
4.5 Langkah Implementasi 3: Implementasi Objek Proxy
Selanjutnya, kita membuat objek proxy, Proxy, yang menyimpan objek RealSubject dan mengimplementasikan interface Subject. Pada metode Request dari Proxy, kita dapat melakukan beberapa operasi tambahan sebelum atau setelah memanggil metode Request dari RealSubject:
package main
import "fmt"
type Proxy struct {
realSubject *RealSubject
}
func (p *Proxy) Request() {
fmt.Println("Proxy: Pra-Permintaan")
if p.realSubject == nil {
p.realSubject = &RealSubject{}
}
p.realSubject.Request()
fmt.Println("Proxy: Pasca-Permintaan")
}
4.6 Langkah Implementasi 4: Memanggil Objek Proxy
Terakhir, kita dapat menggunakan objek proxy, Proxy, untuk memanggil metode objek yang diproxikan, RealSubject:
package main
func main() {
proxy := Proxy{}
proxy.Request()
}
Menjalankan kode di atas akan menghasilkan output:
Proxy: Pra-Permintaan
RealSubject: Menangani Permintaan
Proxy: Pasca-Permintaan
5.1 Perbedaan dan Hubungan antara Pola Proxy dan Pola Dekorator
Baik pola proxy maupun pola dekorator adalah pola desain struktural, yang keduanya memuat objek target dan objek proxy/dekorator. Namun, ada beberapa perbedaan antara keduanya:
- Pola proxy umumnya melibatkan kontrol akses ke objek target, sementara pola dekorator lebih fokus pada memperluas objek target.
- Pola proxy biasanya melakukan operasi tambahan sebelum atau sesudah objek target, sementara pola dekorator secara dinamis menambahkan fungsionalitas ekstra di atas objek target.
5.2 Perbandingan antara Proksi Statis dan Proksi Dinamis
Pola proxy dapat dibagi menjadi proksi statis dan proksi dinamis. Proksi statis menentukan jenis objek proksi pada saat kompilasi, dan objek proksi ditulis secara manual oleh programmer. Proksi dinamis, di sisi lain, secara dinamis menghasilkan objek proksi pada saat runtime berdasarkan antarmuka objek target. Proksi dinamis lebih fleksibel tetapi juga lebih kompleks dibandingkan dengan pendamping statisnya.
5.3 Aplikasi Pola Proxy dalam Arsitektur Mikro Layanan
Pola proxy dapat diterapkan dalam arsitektur mikro layanan. Sebagai contoh, kita dapat menggunakan proksi untuk mengemas akses ke layanan mikro lain dan menerapkan mekanisme seperti keseimbangan beban, pembatasan tingkat, dan pemutus sirkuit di lapisan proksi. Hal ini dapat meningkatkan kehandalan dan kinerja sistem. Pola proxy juga dapat digunakan untuk mengimplementasikan fungsi penemuan layanan dan routing.