1. Modus agen
Agen adalah orang atau lembaga yang bertindak atas nama orang atau lembaga lain. Dalam beberapa kasus, klien tidak menginginkan atau tidak dapat mereferensikan suatu objek secara langsung, dan objek proxy dapat bertindak sebagai perantara antara klien dan objek target.
Pola proksi menyediakan objek proksi untuk suatu objek, dan objek proksi mengontrol referensi ke objek asli.
Contoh dalam kehidupan nyata: Anda sibuk bekerja lembur saat Tahun Baru dan tidak punya waktu untuk membeli tiket kereta api. Saat ini, Anda bisa menghubungi pusat tiket terdekat dan meminta mereka membelikan Anda tiket kereta api pulang menambahkan biaya tenaga kerja tambahan. Namun harus jelas bahwa pusat tiket itu sendiri tidak menjual tiket. Hanya stasiun kereta yang benar-benar menjual tiket. Tiket yang dijual oleh pusat tiket kepada Anda sebenarnya dijual melalui stasiun kereta. Ini sangat penting!
Dalam contoh di atas, Anda adalah "pelanggan", pusat tiket adalah "peran agen", stasiun kereta api adalah "peran nyata", dan penjualan tiket disebut "peran abstrak"!
Contoh kode JAVA mode agen:
Peran abstrak: kelas atau antarmuka abstrak
Copy kode kodenya sebagai berikut:
antarmukaBisnis
{
batal melakukanAction();
}
Peran nyata: benar-benar mengimplementasikan antarmuka logika bisnis
Peran agen: Ini tidak mengimplementasikan antarmuka logika bisnis, namun memanggil peran nyata untuk mengimplementasikannya.
Copy kode kodenya sebagai berikut:
kelas BusinessImplProxy mengimplementasikan Bisnis
{
bi BisnisImpl swasta;
kekosongan publik doAction()
{
jika (bi==null)
{
bi = BusinessImpl baru();
}
lakukanSebelum();
bi.doAction();
lakukanSetelah();
}
kekosongan publik doBefore()
{
System.out.println("Pemrosesan awal!");
}
kekosongan publik doAfter()
{
System.out.println("Pasca-pemrosesan!");
}
}
//kelas ujian
Tes kelas
{
public static void main(String[] args)
{
//Variabel referensi didefinisikan sebagai tipe peran abstrak
Bisnis bi = BusinessImplProxy baru();
bi.doAction();
}
}
Copy kode kodenya sebagai berikut:
<span></span>
Oleh karena itu, dengan dukungan JVM, kelas proxy ("peran agen") dapat dihasilkan secara dinamis saat runtime, dan kita dapat menyelesaikan masalah perluasan kode dalam mode proxy di atas. Setelah menggunakan proxy dinamis, "peran agen" tidak diperlukan untuk dihasilkan secara manual. , yang dihasilkan secara dinamis oleh JVM saat runtime dengan menentukan tiga parameter: pemuat kelas, array antarmuka, dan pengendali panggilan.
Contoh kode JAVA mode proxy dinamis:
Copy kode kodenya sebagai berikut:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
//Peran abstrak: Implementasi proksi dinamis java saat ini hanya mendukung antarmuka dan tidak mendukung kelas abstrak
antarmuka BusinessFoo
{
batal foo();
}
antarmukaBusinessBar
{
Bilah string(Pesan string);
}
//Peran sebenarnya: Benar-benar menerapkan metode logika bisnis
kelas BusinessFooImpl mengimplementasikan BusinessFoo
{
kekosongan publik foo()
{
System.out.println("BusinessFooImpl.foo()");
}
}
kelas BusinessBarImpl mengimplementasikan BusinessBar
{
bilah String publik (Pesan string)
{
System.out.println("BusinessBarImpl.bar()");
membalas pesan;
}
}
//Peran dinamis: menghasilkan kelas proxy secara dinamis
kelas BusinessImplProxy mengimplementasikan InvocationHandler
{
objek privateObject;
Proksi Impl Bisnis() {
}
BusinessImplProxy(Obj objek) {
ini.obj = obj;
}
pemanggilan Objek publik (Proksi objek, Metode metode, Objek[] args) melempar Throwable
{
Hasil objek = null;
lakukanSebelum();
hasil = metode.invoke(obj,args);
lakukanSetelah();
hasil pengembalian;
}
kekosongan publik doBefore(){
System.out.println("lakukan sesuatu sebelum Logika Bisnis");
}
kekosongan publik doAfter(){
System.out.println("lakukan sesuatu setelah Logika Bisnis");
}
Pabrik Objek statis publik (Obj objek)
{
Kelas cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
}
}
//kelas ujian
DynamicProxy kelas publik
{
public static void main(String[] args) melempar Throwable
{
BusinessFooImpl bfoo = BusinessFooImpl baru();
BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
bf.foo();
Sistem.keluar.println();
BusinessBarImpl bbar = BusinessBarImpl baru();
BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
String pesan = bb.bar("Halo,Dunia");
System.out.println(pesan);
}
}
Deskripsi alur program:
new BusinessFooImpl(); membuat "peran nyata", meneruskannya ke metode pabrik BusinessImplProxy.factory(), dan kemudian menginisialisasi "pemroses pemanggilan" - kelas yang mengimplementasikan InvocationHandler. Dan mengembalikan instance kelas proxy yang dibuat secara dinamis. Karena "peran agen" juga harus mengimplementasikan metode logika bisnis yang disediakan oleh "peran abstrak", maka dapat diubah ke BusinessBar dan ditetapkan ke referensi bb yang menunjuk ke tipe BusinessBar.
Metode newProxyInstance(ClassLoader loader, Class<?>[] interface, InvocationHandler h) memungkinkan pemrogram untuk menentukan parameter dan secara dinamis mengembalikan kelas proxy yang diperlukan, sedangkan metode invoke(Object proxy, Method method, Object[] args) digunakan oleh JVM. Dipanggil secara dinamis saat runtime. Saat menjalankan metode "bb.bar("Hello,World");" JVM secara dinamis menetapkan "penangan pemanggil", meneruskan parameter ke pemanggilan luar, dan memanggil method.invoke(obj, args) untuk benar-benar mengeksekusinya!
Metode statis BusinessImplProxy.Factory digunakan untuk menghasilkan kelas proksi secara dinamis ("peran agen"). Peran proksi dihasilkan secara dinamis saat runtime berdasarkan antarmuka logika bisnis yang berbeda, BusinessFoo dan BusinessBar. "Peran abstrak", "peran agen", dan pengendali pemanggilan (kelas yang mengimplementasikan antarmuka InvocationHandler) semuanya dapat diubah, sehingga proksi dinamis JAVA sangat kuat.