Este artigo contén varias ligazóns externas e/ou bibliografía ao fin da páxina, mais poucas ou ningunha referencia no corpo do texto. Por favor, mellora o artigo introducindo notas ao pé, citando as fontes.
O padrón de deseñoProxy é 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.
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
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
publicabstractclassSuxeito{publicSuxeito(Stringnome){_nome=nome;}publicStringtoString(){return_nome;}publicabstractvoidmetodo1();publicabstractvoidmetodo2();privateString_nome;}publicclassSuxeitoRealextendsSuxeito{publicSuxeitoReal(Stringnome){super(nome);}publicvoidmetodo1(){System.out.println("Executando metodo1 en "+this);}publicvoidmetodo2(){System.out.println("Executando metodo2 en "+this);}}publicclassProxyextendsSuxeito{publicProxy(Stringnome){super(nome);_accesos_metodo1=0;_accesos_metodo2=0;_suxeito_real=null;}privateSuxeitoRealobterSuxeitoReal(){if(_suxeito_real==null){_suxeito_real=newSuxeitoReal(this+" (Real)");}return_Suxeito_real;}publicvoidmetodo1(){_accesos_metodo1++;obterSuxeitoReal().metodo1();}publicvoidmetodo2(){_accesos_metodo2++;obterSuxeitoReal().metodo2();}publicvoidstatus(){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.");}}privateSuxeitoReal_suxeito_real;privateint_accesos_metodo1,_accesos_metodo2;}publicclassCliente{publicCliente(Suxeitosuxeito){_suxeito=suxeito;}publicvoidexecutar(){_suxeito.metodo1();_suxeito.metodo1();_suxeito.metodo2();_suxeito.metodo1();}privateSuxeito_suxeito;}publicclassMain{publicstaticvoidmain(String[]argv){Proxyobxecto_a=newProxy("obxecto_a");Clientec=newCliente(obxecto_a);obxecto_a.status();c.executar();obxecto_a.status();SuxeitRealobxecto_b=newSuxeitoReal("obxecto_b");Cliented=newCliente(obxecto_b);d.executar();}}
Véxase tamén
Bibliografía
E. Gamma, R. Helm, R. Johnson and J. Vlissides (1994). Design Patterns: elements of reusable object-oriented software. Addison-Wesley.