Semua agen tahu bahwa ketika Anda pergi berbelanja, ada banyak agen, dan mereka hanya menjual produk asli. Misalnya, jika Anda ingin membeli daging setiap hari, babi dibesarkan oleh petani, tetapi jika Anda membeli daging dari tukang daging, tukang daging dapat dianggap sebagai agen. Lalu mengapa Anda membutuhkan agen? Babi dan kemudian membantai mereka.
Cara mengimplementasikan proses ini dengan kode: kita harus menggunakan tiga kategori: tukang daging, dan petani untuk merujuk kepada Anda, tukang daging, dan petani masing -masing. Di antara mereka, petani juga menyediakan metode untuk membeli daging untuk memanggil tukang daging.
Salinan kode adalah sebagai berikut:
Petani kelas {
public int buymeat (int money) {
int daging = 0;
// ... daging = ***;
mengembalikan daging;
}
}
The Butcher memberi Anda metode untuk membeli daging. kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
Kelas tukang daging {
public int buymeat (int money) {
Petani Petani = Petani Baru ();
int daging = petani.
Daging += 5;
mengembalikan daging;
}
}
Namun, kode yang Anda beli daging dari tukang daging menjadi seperti ini:
Salinan kode adalah sebagai berikut:
kelas Anda {
public void work () {
int youmoney = 10;
Butcher Butcher = New Butcher ();
int daging = daging.
System.out.println ("Masak daging, berat:" + daging); // Anda memasaknya.
}
}
Kami juga dapat mengoptimalkan program ini. itu adalah tukang daging atau petani.
Salinan kode adalah sebagai berikut:
kelas Anda {
public void work () {
int youmoney = 10;
Peldar Peldar = Butcher baru ();
int daging = peldar.buymeat (youmoney);
System.out.println ("Masak daging, berat:" + daging);
}
}
antarmuka peldar {
int buymeat (int int);
}
Kelas tukang daging mengimplementasikan Peldar {
@Mengesampingkan
public int buymeat (int money) {
Petani Petani = Petani Baru ();
int daging = petani.
Daging += 5;
mengembalikan daging;
}
}
Petani kelas mengimplementasikan Peldar {
@Mengesampingkan
public int buymeat (int money) {
int daging = 0;
// ... daging = ***;
mengembalikan daging;
}
}
Ini adalah proxy.
Namun, ini disebut proxy statis, karena kelas proxy (kelas daging) ditulis oleh Anda, dan proxy dinamis adalah untuk secara dinamis menghasilkan kelas proxy yang setara saat Java sedang berjalan. Meskipun kelas dihasilkan secara dinamis, kode untuk membunuh babi dan menyuntikkan air masih perlu ditulis, jangan lagi menulis kelas lagi. Di mana menulisnya?
Salinan kode adalah sebagai berikut:
Invocation Handller {
Invoke Objek Publik (Proxy Objek, Metode Metode, Objek [] args) melempar yang dapat dilempar;
}
Apa arti parameternya?
Salinan kode adalah sebagai berikut:
Invocation Invocation Handler {
Invoke objek publik (objek tukang daging, metode pembelian, objek [] uang) melempar yang dapat dilemparkan;
}
Parameter pertama adalah objek dari kelas proxy yang dihasilkan secara otomatis (objek kelas daging yang secara otomatis dihasilkan), dan parameter kedua adalah objek metode yang dipanggil (bagaimana metode ini memiliki objek, lihat java Mekanisme Refleksi). Kami hanya memiliki satu metode yang disebut Parameter ini. Jadi kode untuk membunuh babi dan mengisi air menjadi seperti ini saat ditulis:
Salinan kode adalah sebagai berikut:
InvocationHandler MinVocationHandler = new InvocationHandler () {
@Mengesampingkan
Objek publik Invoke (objek tukang daging, metode pembelian, objek [] args) melempar lemparan {
Petani Petani = Petani Baru ();
int meat = (integer) buymeat.invoke (petani, args);
Daging += 5;
mengembalikan daging;
}
};
Ini sedikit tidak konsisten dengan metode konvensional untuk memanggil metode pembelian daging petani. Anda mungkin bertanya mengapa tidak memanggilnya secara langsung? Anda memiliki banyak objek petani, bahkan bukan objek petani, dapat digunakan sebagai contoh antarmuka tertentu (antarmuka mana yang ditentukan di bawah ini, mari kita beri nama yang pertama), dan dapat diteruskan sebagai parameter dan kemudian metode menyebutnya. Sekarang mari kita lihat cara menghasilkan kelas proxy.
Salinan kode adalah sebagai berikut:
Objek Statis Publik NewProxyInstance (ClassLoader Loader, Class <?> [] Antarmuka, InvocationHandler H)
melempar IllegalArgumentException
Jelaskan parameternya. adalah antarmuka, dan itu baru saja dihasilkan. Dalam array, dan panggilan yang disebutkan dalam paragraf sebelumnya adalah masalah kegagalan juga jelas. Parameter ketiga, InvocationHandler, lebih dipahami, yaitu, selama metode apa pun di kelas proxy disebut, AvocationHandler akan diberi tahu. Kode lengkap ditulis di bawah ini:
Salinan kode adalah sebagai berikut:
kelas Anda {
public void work () {
int youmoney = 10;
Peldar Peldarproxy = (Peldar) Proxy.NewProxyInstance (getSclass (). GetClassLoader (), kelas baru [] {Peldar.class}, MinVocationHandler);
int daging = peldarproxy.buymeat (youMoney);
System.out.println ("Masak daging, berat:" + daging);
}
InvocationHandler MinVocationHandler = new InvocationHandler () {
@Mengesampingkan
Invoke Objek Publik (Object Butcher, Metode BuyMeat, Object [] args)
melempar lempar {
Petani Petani = Petani Baru ();
int meat = (integer) buymeat.invoke (petani, args);
Daging += 5;
mengembalikan daging;
}
};
}
antarmuka peldar {
int buymeat (int int);
}
Petani kelas mengimplementasikan Peldar {
@Mengesampingkan
public int buymeat (int money) {
int daging = 0;
// ... daging = ***;
mengembalikan daging;
}
}
Di sini, kelas proxy dihasilkan di kelas Anda.