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.
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...