Patrón Proxy
El patrón Proxy proporciona un sustituto para otro objeto con el fin de controlar el acceso a él. Úsalo para inicialización perezosa, control de acceso, caché o invocación remota: situaciones en las que quieres interceptar las llamadas sin cambiar el objeto real.
Resumen
El patrón Proxy coloca un objeto sustituto entre el llamador y el real. El proxy implementa la misma interfaz, así que los clientes no notan que existe, pero puede diferir la creación, aplicar permisos, registrar llamadas, cachear resultados o reenviar la petición por red. JavaScript incluso trae un Proxy nativo para llevar la misma idea al nivel del lenguaje.
Cuándo usarlo
- El objeto real es costoso de crear y quieres inicialización perezosa (proxy virtual).
- Necesitas aplicar permisos o auditar accesos antes de delegar (proxy de protección).
- El objeto real vive en otro lugar —otro proceso, otro servicio— y quieres un sustituto local (proxy remoto).
Ejemplo
interface Image {
display(): void;
}
class RealImage implements Image {
constructor(private readonly filename: string) {
console.log(`Cargando ${filename} desde disco`);
}
display() { console.log(`Mostrando ${this.filename}`); }
}
class ImageProxy implements Image {
private real?: RealImage;
constructor(private readonly filename: string) {}
display() {
if (!this.real) this.real = new RealImage(this.filename);
this.real.display();
}
}
const image: Image = new ImageProxy("photo.png");
image.display(); // carga + muestra
image.display(); // solo muestraVentajas
- Añade comportamiento (lazy load, auth, caché) sin tocar el objeto real ni el cliente.
- El objeto real puede mantenerse simple: las preocupaciones transversales viven en el proxy.
- Habilita diseños remotos y distribuidos sin filtrar detalles de transporte.
Desventajas
- Una capa más que el equipo debe conocer al depurar.
- Si la lógica del proxy se complica (invalidación de caché, reintentos), puede divergir del contrato del objeto real.
- Cadenas de proxies son fáciles de escribir pero dolorosas de razonar.