O padrón de deseño Proxy é un padrón estrutural que ten como propósito proporcionar un subrogado ou intermediario dun obxecto para controlar o seu acceso.
Motivación
Para explicar a motivación do uso deste padrón vexamos un exemplo onde a súa aplicación sería a solución máis axeitada ao problema requirido.
Editor que pode engadir obxectos dentro dun documento. A apertura do documento deberá ser rápida, e a creación dos obxectos (imaxes de gran tamaño) é cara Non é necesario crear todos os obxectos con imaxes ao abrir o documento porque non todos os obxectos son visibles. Solución : cargar as imaxes baixo demanda. Problema: Como cargar as imaxes baixo demanda sen complicar o resto do editor? Solución: Utilizar un obxecto proxy que se comporte como unha imaxe normal e que sexa o responsable de cargalas baixo demanda. centro|Exemplo proxy
Aplicabilidade
O padrón proxy necesita dunha forma de referencia a un obxecto máis flexible que un punteiro. Dependendo da función que se desexe realizar con dita referencia pódense distinguir diferentes tipos de proxies:
proxy remoto: representante local dun obxecto remoto. proxy virtual: crea obxectos custosos baixo demanda (como a clase ImageProxy do exemplo de motivación). proxy de protección: controla o acceso ao obxecto orixinal.
Estrutura centro|Estrutura proxy.
Participantes
Proxy (ImageProxy) Mantén unha referencia ao obxecto real (RealSubject). Proporciona unha interface idéntica ao suxeito (Subject). Controla o acceso ao obxecto real e pode ser o responsable da súa creación e borrado. Subject (Graphic) Define a interface común de Proxy e RealSubject. RealSubject (Image) Define o obxecto real.
Colaboracións
Dependendo da clase de proxy, o obxecto proxy redirixe as peticións ao obxecto real que representa.
Consecuencias
O uso do proxy introduce un nivel de indirección adicional con diferentes usos: Un proxy remoto oculta o lugar onde reside un obxecto. Un proxy virtual realiza optimizacións como creación baixo demanda. Os proxies de protección permite realizar diversas tarefas de mantemento adicional ao acceder a un obxecto.
Implementación public abstract class Suxeito {
public Suxeito(String nome) { _nome = nome;
public String toString() { return _nome;
public abstract void metodo1(); public abstract void metodo2();
private String _nome; }
public class SuxeitoReal extends Suxeito {
public SuxeitoReal(String nome) { super(nome);
public void metodo1() { System.out.println("Executando metodo1 en " + this);
public void metodo2() { System.out.println("Executando metodo2 en " + this);
public class Proxy extends Suxeito {
public Proxy(String nome) { super(nome); _accesos_metodo1 = 0; _accesos_metodo2 = 0; _suxeito_real = null;
private SuxeitoReal obterSuxeitoReal() { if (_suxeito_real == null) { _suxeito_real = new SuxeitoReal(this + " (Real)"); } return _Suxeito_real;
public void metodo1() { _accesos_metodo1++; obterSuxeitoReal().metodo1();
public void metodo2() { _accesos_metodo2++; obterSuxeitoReal().metodo2();
public void status() { if (_suxeito_real != null) { System.out.println("Accesos a " + _suxeito_real + ": metodo1=" + _accesos_metodo1 + ", metodo2=" + _accesos_metodo2); } else { System.out.println("Suxeito Real (" + this + ") no creado.");
private SuxeitoReal _suxeito_real; private int _accesos_metodo1, _accesos_metodo2;
public class Cliente {
public Cliente(Suxeito suxeito) { _suxeito = suxeito;
public void executar() { _suxeito.metodo1(); _suxeito.metodo1(); _suxeito.metodo2(); _suxeito.metodo1();
private Suxeito _suxeito; }
public class Main {
public static void main(String[] argv) { Proxy obxecto_a = new Proxy("obxecto_a"); Cliente c = new Cliente(obxecto_a);
obxecto_a.status(); c.executar(); obxecto_a.status();
SuxeitReal obxecto_b = new SuxeitoReal("obxecto_b"); Cliente d = new Cliente(obxecto_b);
d.executar();
Véxase tamén Bibliografía
Categoría:Padróns de deseño