Mi granito de java: Proxy

viernes, 3 de junio de 2011

Proxy

El patrón Proxy se utiliza como intermediario para acceder a un objeto, permitiendo controlar el acceso a él. Para ello obliga que las llamadas a un objeto ocurran indirectamente a través de un objeto proxy, que actúa como un sustituto del objeto original, delegando luego las llamadas a los métodos de los objetos respectivos.

Este patrón se debe utilizar cuando:
Se necesite retrasar el coste de crear e inicializar un objeto hasta que es realmente necesario.
  • Se necesita una referencia a un objeto más flexible o sofisticada que un puntero.
  • Algunas situaciones comunes de aplicación son:
  1. Proxy remoto: representa un objeto en otro espacio de direcciones. Esto quiere decir que el proxy será utilizado de manera tal que la conexión con el objeto remoto se realice de forma controlada sin saturar el servidor.
  2. Proxy virtual: crea objetos costosos por encargo. Cuando se utiliza un software no siempre se cargan todas las opciones por default. Muchas veces se habilitan ciertos módulos sólo cuando el usuario decide utilizarlos.
  3. Proxy de protección: controla el acceso a un objeto. Controla derechos de acceso diferentes.
  4. Referencia inteligente: sustituto de un puntero que lleva a cabo operaciones adicionales cuando se accede a un objeto (ej. contar el número de referencias, cargar un objeto persistente en memoria, bloquear el objeto para impedir acceso concurrente, ...).

    El patrón Proxy es muy versátil. Puede ser utilizado en infinitas ocasiones y se le puede otorgar varios usos. Tiene una gran ventaja y es que no obliga al desarrollador a crear demasiada estructura para realizar este patrón, sino que es una forma estándar de acceder a una clase que potencialmente puede ser conflictiva. Por otro lado, no ayuda al desarrollador a crear un algoritmo, sino que el desarrollador tiene que hacer toda la lógica.

    Por estas razones, es un patrón donde no siempre se puede saber a priori cuando utilizarlo. Sin embargo, un Proxy es un concepto utilizado fuera del ámbito de los patrones de diseño: un servidor proxy es un equipo intermediario situado entre el sistema del usuario e Internet. Puede utilizarse para registrar el uso de Internet y también para bloquear el acceso a una sede Web. El servidor de seguridad del servidor proxy bloquea algunas redes o páginas Web por diversas razones. En consecuencia, es posible que no pueda descargar el entorno de ejecución de Java (JRE) o ejecutar algunos applets de Java.
    Es decir, los servidores proxy funcionan como filtros de contenidos. Y también mejoran el rendimiento: guardan en la memoria caché las páginas Web a las que acceden los sistemas de la red durante un cierto tiempo. Cuando un sistema solicita la misma página web, el servidor proxy utiliza la información guardada en la memoria caché en lugar de recuperarla del proveedor de contenidos. De esta forma, se accede con más rapidez.

    Este mismo concepto se intenta llevarlo a cabo a nivel código con el patrón Proxy. Cuando un objeto debe ser controlado de alguna manera, ya sea por simple control de acceso o por estar en un sitio remoto o por ser muy pesado y se quiera limitar su uso, es ideal utilizar este patrón.

Diagrama UML


Subject: interfaz o clase abstracta que proporciona un acceso común al objeto real y su representante (proxy).
Proxy: mantiene una referencia al objeto real. Controla la creación y acceso a las operaciones del objeto real.
RealSubject: define el objeto real representado por el Proxy.
Cliente: solicita el servicio a través del Proxy y es éste quién se comunica con el RealSubject.

Ejemplo

Vamos a realizar un ejemplo de un proxy remoto: la finalidad es que nuestra aplicació guarde datos en un servidor remoto, pero vamos a impedir se la aplicación se conecte todo el tiempo, sino que aproveche a guardar todo cuando se encuentre conectada. Caso contrario guardará en el disco duro local la información hasta que sea el momento adecuado.




Hasta ahora tenemos 2 formas de guardar: en el disco y en el objeto remoto que necesita conexión. Ambas formas implementan IGuardar. Vamos a crear un sencillo proxy para que se fije si en ese momento hay conexión para aprovecharla y si no hay conexión que guarde los datos en el disco momentaneamente.
Consecuencias
  • Introduce un nivel de dirección con diferentes usos:
  1. Un proxy remoto puede ocultar el hecho de que un objeto reside en otro espacio de direcciones.
  2. Un proxy virtual puede realizar optimizaciones, como la creación de objetos bajo demanda.
  3. Los proxies de protección y las referencias inteligentes permiten realizar tareas de mantenimiento adicionales al acceder a un objeto.
  • Copiar un objeto grande puede ser costoso. Si la copia no se modifica, no es necesario incurrir en dicho gasto.
Temas a tener en cuenta.
Este patrón no aporta demasiado en cuanto a estructura o algoritmo. Es más que nada un concepto a llevar a cabo en determinadas situaciones.

4 comentarios:

Anónimo dijo...

este tendria que ir dentro de los patrones estructurales. abrazo

Max dijo...

Tenes razon, no lo puse en ningun menu! En casa lo modifico, gracias!

Anónimo dijo...

Buenas, Podrias poner el UML del ejemplo que utilizas

Anónimo dijo...

como seria la clase main para poder correr el codigo?