Proxy

Sustituye a otro objeto para controlar el acceso a él (lazy load, seguridad, caching, remoting).

Contexto

Quieres añadir control transversal (autorización, lazy load, logging, cache) sin que el cliente lo sepa.

Problema

Modificar al objeto real expone preocupaciones que no son suyas.

Solución

Un Proxy implementa la misma interfaz y delega, añadiendo el control antes/después.

#Ejemplo en C# — Virtual Proxy (lazy)

public interface IImage { void Display(); }

public class HighResImage : IImage
{
    private readonly string _path;
    public HighResImage(string path) { _path = path; /* carga 5 MB */ }
    public void Display() => Console.WriteLine(
quot;Mostrando {_path}"); } public class ImageProxy : IImage { private readonly string _path; private HighResImage? _real; public ImageProxy(string path) => _path = path; public void Display() { _real ??= new HighResImage(_path); // solo se carga la primera vez _real.Display(); } }
Cuándo NO aplicarlo
  • Cuando el coste real ya es bajo.
  • Cuando el control podría vivir en el llamador (decorator/middleware).
Tradeoffs
Pro Contra
Control transparente al cliente Una capa más de indirección
Encaja con AOP / interceptores Puede esconder latencia inesperada

#Variantes

  • Virtual Proxy (lazy load).
  • Protection Proxy (autorización).
  • Remote Proxy (representa objetos en otro proceso/máquina).
  • Smart Reference (cuenta referencias, libera).

#structural #gof #wrapper