name: title class: middle, center background-image: url(images/rawpixel/brooklyn-bridge.jpg) background-size: cover # .whiteinline[.fancy[[TE5] Patrones Estructurales]] ### .whiteinline[· Proxy pattern] .whiteinline[Carlos Granell· Universitat Jaume I] .whiteinline[EI1039 - Diseño de Software · Sep 2023] ??? Brooklyn Bridge, New York City, United States. Original public domain image from Wikimedia Commons Image credits: [Rawpixel.com](https://www.rawpixel.com/image/3282163) --- class: inverse, center, middle background-image: url(images/rawpixel/dummies.jpg) background-size: contain ??? La idea de *proxie* esta muy estendida en la vida real. Se utilizan maniquíes de prueba (dummies) en lugar de personas reales para las pruebas de colisión de vehículos. Las tarjeta de crédito son una forma de pago aceptable en lugar de efectivo. Controlled Impact Demonstration instrumented test dummies installed in plane. Original from NASA. Image credits: [Rawpixel.com](https://www.rawpixel.com/image/440073/) --- class: inverse, center, middle # Proxy Pattern .large[Propósito] .large[Problema] .large[Solución] .large[Estructura] .large[Aplicabilidad] --- name: purpose class: center, middle # Proxy: Propósito ## gestiona y controla el acceso a un objeto mediante una .coldinline[interfaz sustituta] --- name: problem # Proxy: Problema ### Acceso a un objeto que contiene y/o trata con información sensible ### Acceso a un objeto que consume gran cantidad de recursos (almacenamiento cache) ### Acceso a un objeto remoto en modo local --- name: solution # Proxy: Solución ### Un _proxy_ crea una nueva clase con la misma interfaz que la del objeto original. ### Un _proxy_ delega las peticiones al objeto original, aunque puede realizar ciertas acciones antes y después de acceder a dicho objeto (y sus métodos). -- > 1. .large[Crea la interfaz común (objeto y proxy)] > 2. .large[`Proxy` implementa la interfaz y guarda una referencia al objeto original] > 3. .large[Delega las peticiones al objeto original] --- name: structure class: left, top background-image: url(images/DivingDesingPatterns09.png) background-size: contain # Proxy: # Estructura ??? Atención a la relación de agregación. ¿Podría ser de composición? Image credits: [refactoring.guru](https://refactoring.guru/es/design-patterns/proxy) --- #
¿Cualés son ciertas según el diagrama UML del patrón `Proxy`? .large[
`Proxy` y `Service` son subtipos de `ServiceInterface`] .large[
Logra polimorfismo implementando la interfaz `ServiceInterface`] .large[
`Service` conoce `Proxy`, lo que significa que la clase `Service` tiene un atributo que se refiere a una instancia de `Proxy`] .large[
No logra polimorfirmo porque `Proxy` y `Service` implementan `ServiceInterface`] ??? 1100 --- name: aplicability # Proxy: Aplicabilidad .large[
Cuando necesitas controlar el acceso a un objeto, ya sea por __protección__, registro, o para redirigir peticiones a los objetos adecuados] (p.e. pedidos a centros logísticos más cercanos, firewall) -- .large[
Si un objeto utiliza muchos recursos, puedes crear una versión __virtual__ (ligera) para retrasar su instanciación hasta que se necesite realmente] (p.e., ahorro memoria) -- .large[
Cuando necesitas acceder a un objeto __remoto__ como si fuera local] (p.e. encapsula comunicación en red con el objeto remoto) --- #
Las responsabilidades del `Proxy` son .large[
Implementar las tareas de la clase `Service`] .large[
Proteger a la clase `Service`, comprobando las solicitudes del cliente y el acceso a dicha clase] .large[
Envolver a la clase `Service`] .large[
Proporcionar al cliente una nueva interfaz, que es diferente de la interfaz de `Service`] ??? 0110 --- name: summary # Resumen ### El patrón Proxy... .large[
"representa" o "camufla" el objeto real/original] .large[
tiene un diseño polimórfico, así los clientes esperan la misma interfaz para el objeto *proxy* que para el objeto real/original] .large[
verifica, controla o registra las peticiones de los clientes al objeto real/originall]