calaix[À]gil

www.calaixagil.com
jlmoga@gmail.com

CAT | ESP | EN




Patrón PROXY

CAT

Data publicació: 09/12/2021
Última modificació: 11/11/2022
Estamos diseñando una classe Subjeto en la que se ejecutan operaciones

Estamos diseñando una classe Subjeto en la que se ejecutan operaciones que sobre servicios que:

  • No se encuentran dentro del ámbito de nuestra aplicación, o
  • Son costosos de crear, y no queremos que nuestra aplicación asuma la responsabilidad de crearlos, o
  • Estan sujetas a una política de accesos o de permisos diferente, o
  • Se quiere incluir mas seguridad o mas control sobre un servicio externo, (por ej: controlar el uso que se hace del objeto, implementar una estadística, controlar bloqueos de otras partes quan se hace uso del objeto, etc.)

En estos casos, se crea una clase llamada Proxy, que especializa la clase sujeto, y que se situa entre la clase que precisa del servicio, y la clase real que ofrece el servicio, manteniendo una referéncia con esta última. La clase Proxy implementa una interfície, que es la misma que la de la clase real. La aplicación utiliza esta interfície, i Proxy implementa todo lo necesario para utilizar el servicio real, desacoplando la clase sujeto de las responsabilidades de este servicio. Además, Proxy puede implementar otra funcionalidad de control o de seguridad, y puede almacenar otra información necesária y complementaria a la del servicio al que suple.

Características

Nombre del patrón Tipo del patrón Fuentes documentales
Proxy Estructural GOF
FLOW
Otros nombres Patrones relacionados
Substituto Adapter
Representante Decorator
Suplente
Surrogate
Embajador

El patrón Adapter propone una interfície diferente para el servicio real al cual adapta, mientras que Proxy implementa en su interfície los mismos métodos que el servicio real, (o el subconjunto útil de estos métodos para la clase Sujeto). Proxy es transparente en su uso al servicio al que substituye, si no es que opcionalmente puede implementar métodos para garantizar la seguridad, o establecer controles; mientras que Adapter propone cambios de funcionamiento respecto al servicio al que adapta.

El patrón Decorator añade nuevas responsabilidades, (proporciona nueva funcionalidad utilizando la heréncia), sobre una clase concreta. No representa un servicio.

Disseño

Sujeto

Es la clase de la aplicación en desarrollo que precisa de un servicio que se implementará con Proxy.

Sujeto real

Esta clase se corresponde a la clase que proporciona el servicio, y de la cual no queremos responsabilizarnos de su complejidad, o de la que no queremos que la aplicación conozca los detalles. Proxy trabaja para resolver esto.

Suplente, (o Proxy)

La clase proxy, (o suplente), crea una interfície que emula la implementación de la clase real. La classe Sujeto hace uso de esta clase en lugar de utilizar directamente el sujeto real.

Ejemplo

En el eemplo tenemos una aplicación que gestiona documentos, representada per la clase Document. Una de les responsabilidades de la clase Document és la carga de documentos. Supongamos que la carga es diferente dependiendo del formato del archivo y otras características. No queremos que la clase Document se responsabilize de todas las vicisitudes de la carga de documentos, así que hace uso de la clase CargaDocumentos. Però esta clase se conforma como un servicio, del cual no conocemos su ubicación exacta y/o no somos responsables de su ubicación ni evolución. Así, hacemos uso de una clase, (esta si, nuestra), que implementa la misma interfície de funcionamiento que CargaDocumentos, que és ProxyCargaDocumetos. La aplicación utiliza el proxy, el cual se encarega de contactar con el servicio i utilizarlo de forma adecuada, y de forma independiente al resto de la aplicación.

Descarga el documento