concepto
Modo proxy: el modo proxy es en realidad una clase proxy adicional para realizar algunas operaciones en el objeto original. Por ejemplo, a veces necesitamos contratar a un abogado cuando vamos a una demanda, porque los abogados tienen experiencia en derecho y pueden operar y expresar nuestras ideas para nosotros. Esto es lo que significa agencia. El modo proxy se divide en dos categorías: 1. Proxy estático (no utilizando los métodos en JDK); 2. Proxy dinámico (usando InvocationHandler y proxy en JDK).
El proxy estático es creado por programadores o herramientas para generar código fuente de clase proxy, y luego compilar la clase proxy. El llamado estático significa que el archivo bytecode de la clase proxy ya existe antes de que se ejecute el programa, y la relación entre la clase proxy y la clase delegada se determina antes de ejecutarse.
El código fuente de la clase proxy dinámica es generado dinámicamente por el JVM de acuerdo con la reflexión y otros mecanismos durante la operación del programa, por lo que no hay un archivo bytecode de la clase proxy. La relación entre la clase proxy y la clase delegada se determina cuando el programa se está ejecutando.
Ejemplo
Aquí damos un ejemplo de un proxy estático:
Diagrama de clases:
/ *** Interfaz Gamer**/ Public Interface iGamePlayer {// Iniciar sesión en el juego Public void Login (String User, String Password); // Kill Monsters, la característica principal de los juegos en línea public Void Killboss (); // actualizar public void Upgrade (); } / *** Gamer**/ public class Gameplayer implementa IgamePlayer {private String name = ""; // Pase el nombre a través del juego de juego de constructor (string _name) {this.name = _name; } // Al luchar contra los monstruos, lo más esperado es matar al antiguo monstruo público vacío killboss () {System.out.println (this.name + "¡Kill Monsters!"); } // Debes iniciar sesión antes de ingresar al juego. Esta es una condición necesaria. Public void login (String User, String Password) {System.out.println ("El nombre de inicio de sesión es" + usuario + "rol" + this.name + "¡Iniciar sesión con éxito!"); } // Actualizar, hay muchas formas de actualizar, gastar dinero para comprar y hacer tareas también es una especie de actualización pública void () {System.out.println (this.name + "¡Otro nivel!"); }} /*** El cliente no es visible para el objeto proxy*/public class GamePlayerProxy implementa IgamePlayer {private iGamePlayer Gameplayer = null; // Proxy Object // Pase a través del constructor a quién practicar Public GamePlayerProxy (String UserName) {this.gamePlayer = New GamePlayer (UserName); } // destinatario para matar monstruos public void killboss () {this.gamePlayer.KillBoss (); } // destinatario para iniciar sesión en publicidad de registro (String User, String Password) {this.gamePlayer.login (usuario, contraseña); } // Practice actualizar public void Upgrade () {this.gameeplayer.upgrade (); }} /** El cliente no es visible para el objeto proxy*/public class GamePlayerProxy2 implementa IgamePlayer {private iGamePlayer Gameplayer = null; // objeto proxy // pasar a través del constructor a quién practicar pública gameeplayerProxy2 (string username) {this.gamePlayer = new GamePlayer); } // destinatario matar monstruos public void killboss () {this.gamePlayer.KillBoss (); } // REGISTRO DE REPORTIVO Public void login (String User, String Password) {System.out.println ("localeString ()"); this.gamePlayer.login (usuario, contraseña); } // Practice Upgrade () public void Upgrade () {this.gamePlayer.upgrade (); System.out.println ("El tiempo de actualización es:" + nueva fecha (). TOLOCALECRING ()); }} /** El cliente no es visible para el objeto proxy*/ public class GamePlayerProxy3 {Gameplayer privado IgamePlayer; // Pase el objeto proxy (proxy) a través del constructor público gameplayerProxy3 (IgamePlayer Gameplayer) {this.gamePlayer = GamePlayer; System.out.println ("Soy un proxy, el personaje que interpreto es el de otra persona y puede pasar dinámicamente"); } public iGamePlayer getProxy () {return (iGamePlayer) proxy.newproxyInstance (this.getClass (). getClassLoader (), nueva clase [] {iGamePlayer.class}, new MyInVocationHandler ()); } Clase privada myInVocationHandler implementa InvocationHandler {@Override Public Object Invoke (Object Proxy, Method Method, Object [] args) lanza lanzable {if (método.getName (). Equals ("Login")) {System.out.println ("LocalString ()"); } if (método.getName (). Equals ("actualización")) {System.out.println ("El tiempo de actualización es:" + nueva fecha (). TOLOCALECRING ()); } método.invoke (Gameplayer, Args); regresar nulo; }}} Public Class Test {public static void main (string [] args) { /** proxy estático normal: el cliente no conoce el objeto proxy, y el objeto proxy completa su función call* / iGamePlayer proxy = new GameplayerProxy ("x"); System.out.println ("La hora de inicio es:" + nueva fecha (). TOLOCALECRING ()); proxy.login ("zhangsan", "abcd"); proxy.killboss (); proxy.upgrade (); System.out.println ("El tiempo de finalización es:" + nueva fecha (). TOLOCALECRING ()); System.out.println (); /** El objeto proxy mejora la función del objeto proxy*/ igamePlayer proxy2 = new GamePlayerProxy2 ("M"); proxy2.login ("lisi", "efg"); proxy2.KillBoss (); proxy2.upgrade (); System.out.println (); /** Proxy dinámico: use el InvocationHandler proporcionado por JDK para reflejar el método de llamar al objeto proxy* combinado con java.reflect.proxy para generar objetos proxy* Ingresar dinámicamente el objeto proxy para construir el invocador, y las funciones del objeto proxy se pueden mejorar cuando se invoque en el control realizado (notificación) * En GameplayerProxy3, es la hora de inicio de notificación cuando el método se llama Iniciar sesión, y el tiempo de finalización de notificaciones cuando la actualización */ GameplayerProxy3 Dynamic = New GameplayerProxy3 (nuevo juego ("y")); IgamePlayer DynamicPlayer = Dynamic.getProxy (); DynamicPlayer.login ("Wangwu", "1234"); DynamicPlayer.KillBoss (); DynamicPlayer.upgrade (); /** Orientada a la edición: se debe agregar una lógica comercial similar a muchos lugares, por lo que podemos extraerla en la sección, que es la sección de transacción: como sección de registro, sección de permiso, sección de negocios*/}} Imprimir:
¡La hora de inicio es: 2014-10-8 17:19:05 Rol de inicio de sesión X con Zhangsan se inicia con éxito! X está luchando contra monstruos! ¡X ha sido actualizado a otro nivel! La hora final es: 2014-10-8 17:19:05 El tiempo de inicio de sesión es: 2014-10-8 17:19:05 Iniciar sesión M con el nombre Lisi se registra con éxito! ¡M está luchando contra monstruos! ¡M ha sido actualizado a otro nivel! El tiempo de actualización es: 2014-10-8 17:19:05 Soy un jugador proxy. El personaje que interpreto es el de otra persona, y puedo pasarlo dinámicamente para iniciar sesión. ¡El tiempo es: 2014-10-8 17:19:05 El personaje de inicio de sesión Y con el nombre Wangwu se inició con éxito! ¡Está luchando contra monstruos! ¡El tiempo de actualización es: 2014-10-8 17:19:05 Y se ha actualizado a otro nivel!
ventaja
(1) El papel de las claras responsabilidades es realizar la lógica comercial real, y no tiene que preocuparse por otros asuntos no responsables. Puede completar una transacción a través de un agente posterior. El resultado que lo acompaña es una programación concisa y clara.
(2) El objeto proxy puede actuar como un intermediario entre el cliente y el objeto objetivo, que juega un papel y protege el objeto objetivo.
(3) Alta escalabilidad