konsep
Mode proxy: Mode proxy sebenarnya adalah kelas proxy tambahan untuk melakukan beberapa operasi pada objek asli. Sebagai contoh, kadang -kadang kita perlu menyewa pengacara ketika kita melakukan gugatan, karena pengacara memiliki keahlian dalam hukum dan dapat mengoperasikan dan mengekspresikan ide -ide kita untuk kita. Inilah yang dimaksud dengan agensi. Mode proksi dibagi menjadi dua kategori: 1. Proxy statis (tidak menggunakan metode dalam JDK); 2. Dinamis Proxy (menggunakan InvocationHandler dan Proxy di JDK).
Proxy statis dibuat oleh programmer atau alat untuk menghasilkan kode sumber kelas proxy, dan kemudian mengkompilasi kelas proxy. Yang disebut statis berarti bahwa file bytecode dari kelas proxy sudah ada sebelum program berjalan, dan hubungan antara kelas proxy dan kelas delegasi ditentukan sebelum berjalan.
Kode sumber kelas proxy dinamis secara dinamis dihasilkan oleh JVM menurut refleksi dan mekanisme lain selama operasi program, sehingga tidak ada file bytecode dari kelas proxy. Hubungan antara kelas proxy dan kelas delegasi ditentukan saat program berjalan.
Contoh
Di sini kami memberikan contoh proxy statis:
Diagram kelas:
/ *** Antarmuka Gamer**/ Antarmuka Publik Igameplayer {// Masuk ke Game Public Void Login (Pengguna String, Kata Sandi String); // Bunuh Monster, fitur utama dari game online Void Killboss (); // upgrade upgrade public void (); } / *** gamer**/ gameplayer kelas publik mengimplementasikan igameplayer {private string name = ""; // Berikan nama melalui gameplayer publik konstruktor (string _name) {this.name = _name; } // Saat melawan monster, yang paling diharapkan adalah membunuh monster lama void killboss () {System.out.println (this.name + "Bunuh monster!"); } // Anda harus masuk sebelum memasuki game. Ini adalah kondisi yang diperlukan. Login public void (String User, String Password) {System.out.println ("Nama login adalah" + pengguna + "peran" + this.name + "Login berhasil!"); } // upgrade, ada banyak cara untuk meningkatkan, menghabiskan uang untuk membeli, dan melakukan tugas juga merupakan semacam pembaruan public void () {System.out.println (this.name + "Level lain!"); }} /*** Klien tidak terlihat oleh objek proxy*/gameplayerProxy kelas publik mengimplementasikan igameplayer {private igameplayer gameplayer = null; // objek proxy // lewati konstruktor kepada siapa untuk mempraktikkan gameplayerproxy (string username) {this.gerams.gamepam) gameplayerproxy (string username) {this.gamepam } // penerima untuk membunuh monster void killboss () {this.gameplayer.killboss (); } // penerima untuk login login public void (string user, string password) {this.gameplayer.login (pengguna, kata sandi); } // Praktek Upgrade Public Void Upgrade () {this.gamePlayer.Upgrade (); }} /** Klien tidak terlihat oleh objek proxy*/gameplayerRproxy2 } // penerima membunuh monster void killboss () {this.gameplayer.killboss (); } // penerima login public void login (pengguna string, kata sandi string) {System.out.println ("localestring ()"); this.gameplayer.login (pengguna, kata sandi); } // Praktek upgrade () public void upgrade () {this.gamePlayer.Upgrade (); System.out.println ("Waktu Peningkatan adalah:" + Tanggal Baru (). TolocaleString ()); }} /** Klien tidak terlihat oleh objek proxy*/ gameplayerRproxy3 {private igameplayer gameplayer; // Lewati objek proxy (proxy) melalui konstruktor publik gameplayerproxy3 (igameplayer gameplayer) {this.gameplayer = gameplayer; System.out.println ("Saya seorang proxy, karakter yang saya mainkan adalah milik orang lain, dan dapat dilewati secara dinamis"); } igameplayer public getProxy () {return (igameplayer) proxy.newProxyInstance (this.getClass (). getClassLoader (), kelas baru [] {igameplayer.class}, myinvocationhandler baru ()); } kelas pribadi myInvocationHandler mengimplementasikan InvocationHandler {@Override Objek publik Invoke (objek proxy, metode metode, objek [] args) melempar lempar {if (method.getname (). equals ("login")) {System.out.println ("localestring ()"); } if (method.getName (). Equals ("upgrade")) {System.out.println ("Waktu peningkatan adalah:" + tanggal baru (). TolocaleString ()); } method.invoke (gameplayer, args); kembali nol; }}} tes kelas publik {public static void main (string [] args) { /** proxy statis normal: klien tidak tahu objek proxy, dan objek proxy melengkapi fungsinya panggilan* / igameplayer proxy = gameplayerproxy baru ("x"); System.out.println ("Waktu mulai adalah:" + tanggal baru (). TolocaleString ()); proxy.login ("Zhangsan", "ABCD"); proxy.killboss (); proxy.upgrade (); System.out.println ("Waktu akhir adalah:" + tanggal baru (). Tolocalestring ()); System.out.println (); /** Objek proxy meningkatkan fungsi objek proxy*/ igameplayer proxy2 = gameplayerproxy2 baru ("m"); proxy2.login ("Lisi", "EFG"); proxy2.killboss (); proxy2.upgrade (); System.out.println (); /** Proxy Dinamis: Gunakan InvocationHandler yang disediakan oleh JDK untuk mencerminkan metode memanggil objek proxy* dikombinasikan dengan java.reflect.proxy untuk menghasilkan objek proxy* secara dinamis memasuki objek proxy untuk membangun poin (dan fungsi-fungsi yang lain di tempat lain. dilakukan (pemberitahuan) * Dalam gameplayerproxy3, ini adalah waktu mulai pemberitahuan ketika metode ini disebut login, dan pemberitahuan akhir saat peningkatan */ gameplayerproxy3 dinamis = gameplayerProxy3 baru (gameplayer baru ("y")); Igameplayer DynamicPlayer = Dynamic.getProxy (); DynamicPlayer.Login ("Wangwu", "1234"); DynamicPlayer.KillBoss (); DynamicPlayer.Upgrade (); /** Berorientasi Edit: Beberapa logika bisnis serupa perlu ditambahkan ke banyak tempat, sehingga kami dapat mengekstraknya ke bagian tersebut, yang merupakan bagian transaksi: seperti bagian log, bagian izin, bagian bisnis*/}} Mencetak:
Waktu mulai adalah: 2014-10-8 17:19:05 Peran login X dengan Zhangsan berhasil masuk! X melawan monster! X telah ditingkatkan ke level lain! Waktu akhirnya adalah: 2014-10-8 17:19:05 Waktu login adalah: 2014-10-8 17:19:05 Peran login M dengan nama Lisi berhasil masuk! M melawan monster! M telah ditingkatkan ke level lain! Waktu peningkatan adalah: 2014-10-8 17:19:05 Saya seorang pemain proxy. Karakter yang saya mainkan adalah milik orang lain, dan saya dapat secara dinamis meneruskannya untuk masuk. Waktunya adalah: 2014-10-8 17:19:05 Karakter login dengan nama Wangwu berhasil masuk! Y sedang melawan monster! Waktu peningkatan adalah: 2014-10-8 17:19:05 y telah ditingkatkan ke level lain!
keuntungan
(1) Peran tanggung jawab yang jelas adalah untuk mewujudkan logika bisnis yang sebenarnya, dan Anda tidak perlu peduli dengan urusan yang tidak bertanggung jawab lainnya. Anda dapat menyelesaikan transaksi melalui agen selanjutnya. Hasil yang menyertainya adalah pemrograman yang ringkas dan jelas.
(2) Objek proxy dapat bertindak sebagai perantara antara klien dan objek target, yang memainkan peran dan melindungi objek target.
(3) Skalabilitas tinggi