Articulo de referencia

Patrón proxy

En programación informática , el patrón proxy es un patrón de diseño de software que consiste en una clase que funciona como interfaz para otro elemento. El proxy puede interact...

En programación informática , el patrón proxy es un patrón de diseño de software que consiste en una clase que funciona como interfaz para otro elemento. El proxy puede interactuar con cualquier cosa: una conexión de red, un objeto grande en memoria, un archivo o cualquier otro recurso costoso o imposible de duplicar. En resumen, un proxy es un objeto contenedor o agente que el cliente llama para acceder al objeto real que se ejecuta en segundo plano. El uso del proxy puede consistir simplemente en reenviar la solicitud al objeto real o puede proporcionar lógica adicional. En el proxy, se puede proporcionar funcionalidad adicional, por ejemplo, almacenamiento en caché cuando las operaciones sobre el objeto real consumen muchos recursos, o verificar las precondiciones antes de invocar operaciones sobre el objeto real. Para el cliente, el uso de un objeto proxy es similar al uso del objeto real, ya que ambos implementan la misma interfaz.

Descripción general

El patrón de diseño proxy es uno de los veintitrés patrones de diseño GoF más conocidos que describen cómo resolver problemas de diseño recurrentes para diseñar software orientado a objetos flexible y reutilizable , es decir, objetos que son más fáciles de implementar, cambiar, probar y reutilizar. [ 1 ]

Problema

El patrón de diseño proxy se utiliza para resolver este tipo de problemas: [ 2 ]

  • El acceso a un objeto debe estar controlado.
  • Se debería proporcionar funcionalidad adicional al acceder a un objeto.

Al acceder a objetos sensibles, por ejemplo, debería ser posible comprobar que los clientes tienen los derechos de acceso necesarios.

Solución

Defina un Proxyobjeto separado que

  • puede utilizarse como sustituto de otro objeto ( Subject), y
  • Implementa funcionalidades adicionales para controlar el acceso a este tema.

Esto permite trabajar a través de un Proxyobjeto para realizar funciones adicionales al acceder a un sujeto, como comprobar los derechos de acceso de los clientes que acceden a un objeto sensible.

Para actuar como sustituto de un sujeto, un proxy debe implementar la Subjectinterfaz. Los clientes no pueden distinguir si están trabajando con un sujeto o con su proxy.

Véase también el diagrama de clases y secuencia UML a continuación.

Estructura

Diagrama de clases y secuencia UML

Un ejemplo de diagrama de clases y secuencia UML para el patrón de diseño Proxy. [ 3 ]

En el diagrama de clases UML anterior , la clase implementa la interfaz para poder actuar como sustituto de objetos. Mantiene una referencia ( ) al objeto sustituido ( ) para poder reenviarle solicitudes ( ).ProxySubjectSubjectrealSubjectRealSubjectrealSubject.operation()

El diagrama de secuencia muestra las interacciones en tiempo de ejecución: El Clientobjeto funciona a través de un Proxyobjeto que controla el acceso a otro RealSubjectobjeto. En este ejemplo, el objeto Proxyreenvía la solicitud al objeto RealSubjectque ejecuta la solicitud.

Diagrama de clases

Proxy en UML
Proxy en LePUS3 ( leyenda )

Posibles escenarios de uso

Proxy remoto

En la comunicación de objetos distribuidos , un objeto local representa un objeto remoto (que pertenece a un espacio de direcciones diferente). El objeto local actúa como proxy del objeto remoto, y la invocación de un método en el objeto local da como resultado la invocación de un método remoto en el objeto remoto. Un ejemplo sería la implementación de un cajero automático , donde este podría contener objetos proxy para la información bancaria que reside en el servidor remoto.

Proxy virtual

En algunos casos, una representación esquemática puede resultar ventajosa en lugar de un objeto complejo o pesado. Cuando una imagen subyacente es de gran tamaño, puede representarse mediante un objeto virtual proxy, cargando el objeto real bajo demanda.

Proxy de protección

Se puede utilizar un proxy de protección para controlar el acceso a un recurso en función de los derechos de acceso.

Ejemplo

El siguiente es un ejemplo del patrón de diseño proxy en C++ :

importar std ;using std :: string ; using std :: unique_ptr ;// Interfaz del sujeto class Image { public : virtual void display () const = 0 ; virtual ~ Image () = default ; };// Sujeto real (carga costosa) class RealImage : public Image { private : string filename ; public : explicit RealImage ( const string & file ) : filename { file } { loadFromDisk (); }void display () const override { std :: println ( "Mostrando imagen: {}" , filename ); }privado : void loadFromDisk () const { std :: println ( "Cargando imagen desde el disco: {}" , filename ); } };// Proxy (controla el acceso a RealImage) class ProxyImage : public Image { private : string filename ; mutable unique_ptr < RealImage > realImage ; // creado de forma diferida public : explicit ProxyImage ( const string & file ) : filename { file } {}void display () const override { if ( ! realImage ) { std :: println ( "(Proxy) Cargando imagen bajo demanda..." ); realImage = std :: make_unique < RealImage > ( filename ); } realImage -> display (); } };// Código del cliente int main () { Image * img = new ProxyImage ( "photo.png" );// Primera visualización (debería cargarse) img -> display ();// Segunda pantalla (debería usar la imagen en caché) img -> display ();eliminar imagen ; devolver 0 ; }

Véase también

Referencias

  1. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Patrones de diseño: Elementos de software orientado a objetos reutilizable . Addison Wesley. págs. 207 y ss . ISBN  0-201-63361-2.{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace )
  2. "El patrón de diseño Proxy: problema, solución y aplicabilidad" . w3sDesign.com . Consultado el 12 de agosto de 2017 .
  3. "El patrón de diseño Proxy: estructura y colaboración" . w3sDesign.com . Consultado el 12 de agosto de 2017 .
  • Geary, David (22 de febrero de 2002). "Tome el control con el patrón de diseño Proxy" . JavaWorld . Recuperado el 20 de julio de 2020 .
  • PerfectJPattern es un proyecto de código abierto que proporciona una implementación modular del patrón Proxy en Java.
  • Comparación de patrones de adaptador, proxy y fachada en Wayback Machine (archivado el 11 de marzo de 2012)
  • Patrón de diseño proxy
  • Ejemplo de implementación del patrón proxy en C++ en la Wayback Machine (archivado el 19/10/2014).
  • Descripción del patrón proxy del repositorio de patrones de Portland.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Proxy_pattern&oldid=1342759186 "