Patrón de diseño – Proxy

UMLEn esta entrada les hablare del patrón de diseño Proxy, el cual es uno de mis favoritos ya que nos permite hacer una gran cantidad de cosas sin que el usuario final se de cuenta de lo que esta pasando. Podríamos definir a un Proxy como una clase o componentes que hace el papel de intermediario entre la clase que queremos utilizar el cliente que la esta utilizando. Cuando digo intermediario me refiero a que el Proxy nos permite hacer una o varias operaciones antes y después de realizar la tarea que realmente quiere el cliente, incluso el proxy puede tomar la decisión de nunca realizar la tarea solicitada por el usuario.

Patrón de diseño Proxy
Fig.1: Diagrama que muestra como esta conformado un Proxy, Un Proxy se crea a través de una interfaz la cual imita el comportamiento de esta, Sin embargo el trabajo realmente lo delega a otra clase que generalmente también implementan la interfaz del Proxy.

Para entender bien lo que es un Proxy nos iremos al ámbito de las Redes ya que es un tema casi todos comprendemos, Todos hemos escuchado de los proxy de red o Servidores Proxy los cuales nos impiden que entremos a una determinada pagina como por ejemplo las redes sociales o paginas de vídeos en streaming. Pues bien estos servidores implementa el patrón de diseño proxy, ya que antes de enviar la solicitud a la pagina que queremos entrar primero valida si la pagina no esta en la lista de paginas bloqueadas si no es a sí entonces manda el request a la pagina y el proxy antes de enviarnos la respuesta a nuestro navegador valida por ejemplo que la pagina no tenga contenido prohibido como por ejemplo paginas de adulo o vídeo juegos, Si el proxy detecta que la respuesta de la pagina regresa un contendido de estos entonces el proxy nos manda una pagina distinta a la solicitada diciendo que la pagina tiene contenido indeseado.

Los proxy tiene varias utilidades y podemos utilizarlo para lo que queramos, para este caso hablaremos de ejemplo prácticos los cuales son usados con regularidad.

Cuando desarrollamos aplicaciones por lo general desarrollamos clases que utilizamos como BusinessService (Clases con operaciones de negocio) estas clases generalmente no requieren autenticación y los usuarios pueden invocar los métodos sin ningún problema, ¿pero que pasa si un día decidimos que estos métodos requieren de privilegios para ser ejecutados? una solución seria modificar los métodos para que recibieran las credenciales o modificar la aplicación para que valide los privilegios antes de mandar llamar los métodos de negocio, Sin embargo estos cambios son radicales ya que implicaría modificar la firma de los BusinessService impactando gran parte del proyecto o modificar cada parte en donde hacíamos un llamada a los BusinessService para agregar la validación antes de la llamada. Estas soluciones producirían un gran cambio en nuestra aplicación y afectaría los componentes ya desarrollados y probados para tener que volver a la etapa  de pruebas y validar nuevamente que la aplicación sigue funcionando correctamente.

Patrón de diseño Proxy
Fig.2: La figura muestra como el cliente se comunica directamente al Business Service si pasar por un Proxy lo que le da el control absoluto sobre las operaciones que quiera realizar con este.

Solución: En vez de lo anterior podríamos envolver la ejecución del BusinessService en un Proxy el cual antes de mandar llamar al BusinessService cheque las credenciales del usuario y posteriormente invoque al BusinessService, Pero no solo eso podemos hacer, También podría mandar llamar a otro servicio de Auditoria una vez que el servicio de negocio fue invocado, esto es posible por que un proxy puede hacer algo antes y después de realizar la tarea que realmente el cliente quiere realizar, sin embargo el cliente no es consciente de lo que pasa antes y después de la invocación del BusinessService.

Servicio de seguridad con el patrón de diseño Proxy
Fig.3: En la figura podemos apreciar que el usuario realiza un acción sobre el proxy el cual puede realizar una tarea antes y después de realizar la tarea que el cliente, En este escenario se realiza una invocación al servicio de seguridad para validar las credenciales, después realiza la consulta al BusinessService  y por ultimo realiza la llamada a un servicio de auditoria para registrar la acción que acaba de hacer el usuario, El cliente no es consciente de la Pre-Action y la Post-Action pues el Proxy encapsula este comportamiento.

Otro de los escenarios para los cuales se utilizan los proxy son para enmascarar la invocación de métodos remotos.

El procedimiento para realizar esto es creando una interfaz que contenga las operaciones que queremos invocar de forma remota, Luego creamos una un Proxy a través de la interfaz la cual delegue el comportamiento a una clase que se encargue de realizar la comunicación con el servicio remoto y al final regrese lo resultados al cliente de nuestra aplicación, De esta forma la invocación remota es invisible y no se dará cuenta de que detrás del proxy existe una conexión con algún servicio remoto.

Remote Proxy
Fig.4: La figura muestra como desde una aplicación podemos realizar una invocación a un servicio remoto a través de un Proxy, El Proxy delega a otra clase la lógica para la comunicación con el servicio remoto, de esta forma el cliente no se preocupa por como el servicio esta implementado si no por los parámetros que le tiene que inviar al Proxy para que funcione.

Conclusión:

En resumen podríamos decir que un Proxy es un intermediario que puede interceptar una petición y hacer algo con ella antes y después de ejecutar la operación deseada por el usuario e incluso podemos cancelar la invocación como en el caso que no tenga los privilegios.

Es importante remarcar que los Proxy tiene muchas utilidades y estas que planteo a qui solo son alguno de la multitud de utilidades que tiene. Otro escenario para el cual se utilizan es para el Debug de aplicaciones de lo cual hablare en otra entrada.

Ya está a la venta mi nuevo libro “Introducción a los patrones de diseño“, en donde expongo los 25 patrones de diseño más utilizados y explicados desde un enfoque del mundo real, con ejemplos que pueden ser aplicados en tus proyectos. Sin duda es unos de los libros más completos de patrones de diseño en español.

Artículos relacionados

Patrón de diseño Observer Este es sin duda uno de los patrones mas utilizados cuando trabajamos con aplicaciones de escritorio o al utilizar la Event-Driver Architecture(EDA).U...
Patrón de diseño Modelo Vista Controlador (MVC) Sin duda este es uno de los patrones de diseño mas utilizados cuando desarrollamos una pagina web sin embargo puede que no estemos consciente de que e...
Patrón de diseño Command El patrón de diseño Command es muy utilizado cuando se requiere hacer ejecuciones de operaciones sin conocer realmente lo que hacen, estas operaciones...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *