Proxy (Patrón de diseño)

Revisión del 18:01 6 jul 2019 de Javiermartin jc (discusión | contribuciones) (Texto reemplazado: «<div align="justify">» por «»)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Proxy
Información sobre la plantilla
Concepto:El patrón Proxy es un patrón estructural que tiene como propósito proporcionar un subrrogado o intermediario de un objeto para controlar su acceso.

Proxy: Este patrón es un patrón de diseño que proporciona un representante o delegado encargado de controlar el acceso a un objeto, generalmente por motivos de eficiencia.


Nombre del patrón

Proxy (Representante).


Tipo

Estructura, a nivel de objetos.


Motivación

Retrasar el coste de crear e inicializar un objeto hasta que es realmente necesario. Por ejemplo, no abrir las imágenes de un documento hasta que no son visibles. Puede haber ocasiones en que se desee posponer el coste de la creación de un objeto hasta que sea necesario usarlo. El objeto Proxy actúa en lugar del verdadero objeto, y ofrece las misma interfaz, y las solicita en el objeto cuando es necesario.


Aplicabilidad

El patrón proxy se usa cuando se necesita una referencia a un objeto más flexible o sofisticada que un puntero. Dependiendo de la función que se desea realizar con dicha referencia podemos distinguir diferentes tipos de proxies:

  • Proxy remoto: representante local de un objeto remoto.
  • Proxy virtual: crea objetos costosos bajo demanda (como la clase ImagenProxy en el ejemplo de motivación).
  • proxy de protección: controla el acceso al objeto original.
  • Proxy de referencia inteligente: sustituto de un puntero que lleva a cabo operaciones adicionales cuando se accede a un objeto (ej. contar número de referencias al objeto real, cargar un objeto persistente bajo demanda en memoria, control de concurrencia de acceso tal como bloquear el objeto para impedir acceso concurrente).


Participantes

Proxy mantiene una referencia que permite al Proxy acceder al objeto real, proporciona una interfaz identica a la del sujeto, de manera que un Proxy pueda ser sustituido por el sujeto real. Controla el acceso al sujeto real, y puede ser responsable de su creacion y borrado.

  • Proxy remoto: responsable de codificar una petición y sus argumentos, y de enviarla al objeto remoto.
  • Proxy virtual: puede hacer caché de información del objeto real para diferir en lo posible el acceso a este.
  • Proxy de protección: comprueba que el cliente tiene los permisos necesarios para realizar la petición.
  • Subject: Define la interfaz común para el RealSubject y el Proxy, de modo que pueda usarse un Proxy en cualquier sitio en el que se espere un RealSubject.

RealSubject: Define el objeto real representado.


Cuándo usarlo

En cualquier situación en que sea necesaria una referencia a un objeto más versátil y/o sofisticada que un simple puntero. Por ejemplo:

  • Un apoderado remoto proporciona un representante local para un objeto en un espacio de direcciones diferente (J.Coplien los llama embajadores).
  • Un apoderado virtual crea por demanda objetos costosos.
  • Un apoderado de protección restringe, por motivos de seguridad, el acceso a un objeto.
  • Una referencia “inteligente” es una sustitución por un simple puntero, que incorpora servicios adicionales como cuenta del número de referencias, carga de objetos persistentes en memoria cuando estos son referenciados y uso de cerrojos para controlar el acceso exclusivo a regiones críticas.



Ventajas

Este patrón presenta varias ventajas que se deben considerar, tales como:

  • Se introduce un nivel de indirección en el acceso al objeto, que permite al apoderado remoto ocultar el hecho de que el objeto reside en un espacio de direcciones distinto, al apoderado virtual realizar optimizaciones como la creación de objetos por demanda y al apoderado de protección y a las referencias “inteligentes” realizar tareas adicionales de vigilancia sobre el objeto al que se accede. No obstante todo esto puede resultar un inconveniente, por motivos de claridad e inteligibilidad del diseño.
  • Facilita otra optimización, relacionada con la creación de objetos por demanda: la técnica de COPY-ON-WRITE, que sólo hace efectiva la copia de un objeto oneroso cuando el acceso a él es de escritura, no de lectura.


Consecuencias

El uso de un proxy introduce un nivel de indirección adicional con diferentes usos:

  • Un Proxy remoto oculta el hecho de que un objeto reside en otro espacio de direcciones.
  • Un Proxy virtual puede realizar optimizaciones, como la creación de objetos bajo demanda.
  • El Proxy de protección y las referencias inteligentes permiten realizar diversas tareas de mantenimiento adicionales al acceder a un objeto.

Además, su uso también permite realizar una optimización COW (copy-on-write), puesto que copiar un objeto grande puede ser costoso, y si la copia no se modifica, no es necesario incurrir en dicho gasto. Además el sujeto mantiene un número de referencias, y sólo cuando se realiza una operación que modifica el objeto, éste se copia. Es útil por tanto para retrasar la replicación de un objeto hasta que cambia.


Relacionado con

  • Adapter proporciona al objeto que está adaptando una interfaz diferente, mientras que Apoderado presenta la misma interfaz que su representado. No obstante, en el caso del apoderado de protección se pueden rechazar peticiones que el representado sí puede atender, con lo que, de hecho, se está modificando su interfaz.
  • Decorator puede tener una implementación similar a la de Apoderado, a pesar de tener una intención diferente: añadir algún comportamiento a un objeto, en vez de controlar el acceso al mismo. Diferentes apoderados varían en el grado de semejanza en su implementación con respecto a Decorator.


Otros aspectos de interés

  • El “Apoderado” es el encargado de crear y destruir los “Elementos Reales” cuando haga falta.
  • Si el “Apoderado” puede tratar con el “Elemento Real” a través de una interfaz abstracta, entonces no es necesario tener una clase “Apoderado” por cada clase de “Elemento Real”. Pero si el “Apoderado” va a ser instanciado con un “Elemento Real” concreto, debe conocer de que clase es.
  • Para poder representar al “Elemento Real”, el “Apoderado” debe tener una interfaz idéntica a la de “Elemento”.
  • Una cuestión importante es: ¿cómo hacer referencia al “representado” antes de instanciarlo?
  • Un apoderado remoto debe responsabilizarse de empaquetar y enviar las peticiones y sus argumentos al objeto real.
  • Un apoderado virtual puede almacenar información adicional relativa al objeto para posponer el acceso al mismo.
  • Tanto un apoderado de protección como una referencia “inteligente” comprueban los permisos de acceso del cliente antes de pasar la petición al objeto.


Fuentes