Java Proxy Pattern es uno de los patrones de diseño que más se usa en Java. Lamentablemente a veces es difícil de entender como funciona y sobre todo de en que frameworks se utiliza para solventar los diferentes problemas del desarrollo de aplicaciones.¿ Qué es exactamente un Proxy? .Vamos a intentar explicarlo de forma breve.
Java Proxy Pattern y responsabilidades
En Java las clases implementan una funcionalidad concreta a través de sus distintos métodos. Vamos a suponer que tenemos una clase de servicio con un método que nos devuelve el mensaje “hola amigo pepito”, recibiendo como parámetro el nombre que deseemos. Para ello construiremos una interface y una clase que la implemente.
Vamos a ver el resultado a nivel de código:
package com.arquitecturajava.proxy; public interface ServicioMensaje { public String mensaje(String persona); }
package com.arquitecturajava.proxy2; public class ServicioMensajeImpl implements ServicioMensaje { public String mensaje(String persona) { return "hola amigo "+ persona; } }
Ahora usaremos un programa principal para crear el servicio y ejecutarlo.
package com.arquitecturajava.proxy; public class Principal { public static void main(String[] args) { ServicioMensaje sm= new ServicioMensajeImpl(); System.out.println(sm.mensaje("pepito")); } }
El resultado aparecerá en la consola:
Todo funciona correctamente y es un enfoque clásico. Ahora bien que sucede si necesitamos que cada vez que invocamos al método mensaje se realice un log de la petición a un fichero. La solución más sencilla es incluir esta funcionalidad en el método mensaje.
Es cierto que es la más sencilla pero también es la más pobre ya que no podremos reutilizar la clase salvo que en el nuevo programa también realicemos un log. Esta claro que tenemos un problema de diseño ya que la clase tiene dos responsabilidades muy dispares y no cumple con el principio SRP. ¿Cómo podemos solventarlo?. Para eso existe el patrón Proxy.
El concepto de Java Proxy Pattern
¿Que es un Proxy a nivel de Design Pattern? . Un proxy no es mas que un intermediario que se diseña para apoyar a otra clase y dotarla de funcionalidad adicional. En nuestro caso vamos a extraer la funcionalidad de Log a otra clase ServicioMensajeProxy. De esta forma no hará falta modificar la clase original sino que el proxy delegará en ella.
package com.arquitecturajava.proxy2; public class ServicioMensajeProxy implements ServicioMensaje { private ServicioMensaje sm; @Override public String mensaje(String persona) { System.out.println("log del mensaje para"+ persona); //mensaje delegado return sm.mensaje(persona); } public ServicioMensajeProxy() { super(); this.sm = new ServicioMensajeImpl(); } }
Ahora será suficiente con crear primero el proxy e invocarle para que todo se ejecute de forma ordenada.
package com.arquitecturajava.proxy2; public class Principal { public static void main(String[] args) { ServicioMensaje sm= new ServicioMensajeProxy(); System.out.println(sm.mensaje("pepito")); } }
El resultado se muestra por consola:
Acabamos de construir un Proxy ,uno de los patrones que más se usa en frameworks como Spring o standards como EJB. La clave es entender que se trata de un intermediario que añade funcionalidad y modifica el comportamiento por defecto de nuestras clases.
Otros artículos relacionados: Patrón Factoría , Patrón Singleton
Khắc dấu Hải Phòng
blog topic
[…] el código construido previamente. Para poder añadir esta funcionalidad , se necesitan crear proxies dinámicos de tal manera que la funcionalidad de estos se ejecute antes de que invoquemos los […]
Hola, quería preguntar cómo podría ejecutar el patrón de diseño Proxy para una persistencia de datos con mysql????
Estoy interesado en saber cómo. Saludos
Por ejemplo le podrías usar para generar un proxy de log que te haga logs de todas las consultas SQL 🙂
Gracias por responder, pero cómo?? los únicos patrones que se usar son el Singleton, Facade, Adapter, Factory.
En cada clase ej: Persona usaba el Factory para generar el modelo cosa que la propia entidad no conocera su propio modelo.
Es decir puedes hacer que el proxy pueda hacer con los representantes a los modelos o al factory??
Saludos
El proxy digamos que tiene un rol como de fantasma simula ser el objeto real para el programa cliente y luego delega en el de verdad para realizar las operaciones.
[…] no es posible un acceso directo entre los objetos. Esto se suele resolver con el diseño de Proxys clases que realizan la tarea de intermediario entre cliente y servidor añadiendo una capa […]
[…] artículos relacionados: Java Proxy Pattern , Java Singleton Class […]
[…] artículos relacionados: Java Proxy ,Java Singleton , Oracle […]
[…] artículos relacionados: Java Proxy , Java […]
Hola,
un artículo muy bien explicado.
Porque añades super()? Esto debería ejecutar el constructor de la clase Object, pero que sentido tiene en este ejemplo?
Gracias y un saludo.
Lo añade eclipse por defecto , si tu no lo pones igualmente lo pone el compilador 🙂
un decorator no tiene porque aniadir nuevos metodos a la interfaz publica…
Es cierto no es obligatorio
Muy interesante, excelente ejemplo.
Gracias !
de nada 🙂
¿Cúal es la diferencia entre patrón Decorator y Proxy?
un decorador añade nuevos métodos a la interface publica . Por ejemplo java io 😉
De acuerdo, muchas gracias!