¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Design Patterns en PHP
  3. El patrón de diseño Proxy
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

El patrón de diseño Proxy

Descripción

El patrón de diseño Proxy tiene como objetivo el diseño de un objeto que sustituye a otro y controla su acceso.

Ejemplo

Queremos ofrecer para cada vehículo del catálogo la posibilidad de visualizar un pequeño vídeo de presentación. Un clic sobre la fotografía de la presentación del vehículo permitirá reproducir este vídeo.

Una página del catálogo contiene numerosos vehículos y es muy pesado guardar en memoria todos los objetos de animación, pues los vídeos necesitan gran cantidad de memoria, y su transferencia a través de la red toma bastante tiempo.

El patrón de diseño Proxy ofrece una solución a este problema difiriendo la creación de los sujetos hasta el momento en que el sistema los necesita realmente, en este caso tras un clic en la fotografía del vehículo.

Esta solución aporta dos ventajas:

  • La página del catálogo se carga mucho más rápidamente.

  • Solo aquellos vídeos que van a visualizarse se crean, cargan y reproducen.

El objeto fotografía se llama el proxy del vídeo. Procede a la creación efectiva del sujeto únicamente tras haber hecho clic. Sustituye al vídeo en la visualización. Implementa la misma interfaz que el objeto vídeo, haciendo que su utilización sea totalmente transparente para el cliente. La figura 16.1 muestra el diagrama de clases correspondiente. La clase del proxy, AnimacionProxy, y la clase del vídeo...

Estructura

1. Diagrama de clases

La figura 16.4 ilustra la estructura genérica del patrón de diseño Proxy.

images/figure16-4.png

Figura 16.4 - Estructura del patrón de diseño Proxy

Conviene observar que los métodos del proxy tienen dos comportamientos posibles cuando el sujeto real no ha sido creado: o bien crean el sujeto real y a continuación le delegan el mensaje (es el caso del método clic del ejemplo), o bien ejecutan un código de sustitución (es el caso del método dibuja del ejemplo).

2. Participantes

Los participantes del patrón de diseño Proxy son los siguientes:

  • Sujeto (AnimacionInterfaz) es la interfaz común al proxy y al sujeto real.

  • SujetoReal (Video) es el objeto que el proxy controla y representa.

  • Proxy (AnimacionProxy) es el objeto que se sustituye por el sujeto real. Posee una interfaz idéntica a este último (interfaz Sujeto). Se encarga de crear y de destruir al sujeto real y de delegarle los mensajes.

3. Colaboraciones

El proxy recibe las llamadas del cliente en lugar del sujeto real. Cuando lo juzga apropiado, delega estos mensajes en el sujeto real. Debe, en este caso, crear el sujeto real si no está creado ya.

Dominios de aplicación

Los proxys son muy útiles en programación orientada a objetos. Existen distintos tipos de proxy. Vamos a ilustrar tres:

  • Proxy virtual: permite crear un objeto de tamaño importante en el momento adecuado.

  • Proxy remoto: permite acceder a un objeto ejecutándose en otro entorno.

  • Proxy de protección: permite asegurar el acceso a un objeto, por ejemplo mediante técnicas de autenticación.

Ejemplo en PHP

Retomamos nuestro ejemplo en PHP. El código fuente de la interfaz AnimacionInterfaz aparece a continuación.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Proxy; 
 
interface AnimacionInterfaz 
{ 
   public function dibuja(): void; 
 
   public function clic(): void; 
}  

El código fuente PHP de la clase Video que implementa esta interfaz aparece a continuación. En el marco de la simulación cada método muestra simplemente un mensaje en pantalla.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Proxy; 
 
class Video implements AnimacionInterfaz 
{ 
   public function clic(): void 
   { 
       echo 'Se ha recibido el evento clic' . PHP_EOL; 
   } 
 
   public function dibuja(): void 
   { 
       echo 'Visualizar el vídeo' . PHP_EOL; 
   } 
 
   public function carga(): void 
   { 
       echo 'Cargar el vídeo' . PHP_EOL; 
   } 
 
   public function...