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