lunes, 6 de octubre de 2008

Patron de Diseño "Dynamic Proxy"

"Dynamic proxy" es un patron de diseño.

Un proxy es un intermediario entre un objeto y otro, o bien una persona autorizada para actuar como si fuera otra.


El proxy debe tener una referencia al objeto en cuestion


Types of Proxies

Remote Proxy - Provee una referencia a objetos remotos (RMI)

Virtual Proxy - Crea un objeto solo hasta que es realmente requerido. (Tipo Populate on demand)

Copy-On-Write Proxy - Es un tipo de proxy virtual que utiliza una copia del objeto para protegerlo de escritura

Protection (Access) Proxy - Es un tipo de proxy en el que se deben implementar mecanismos para para validar acceso. Por ejemplo Si un usuario tiene permisos solo de lectura no podra hacer llamadas a metodos de escritura.

Cache Proxy - Mantiene resultados almacenados en una memoria para permitir el acceso a mayor cantidad de usuarios

Firewall Proxy - Para proteger acceso a clientes no deseados

Synchronization Proxy - Provee acceso a multiples clientes

Smart Reference Proxy - Permite dar una mayor funcionalidad a los objetos, como mantener un conteo de las llamadas a un metodo.


A continuacion veremos un poco de codigo de java para ver como implementar un proxy dinamico.


Este ejemplo es muy sencillo y Si tienen dudas seria bueno comentarlas.



____________________________________________________________________________________________

Supongamos que tenemos una Interfaz que defina algunas operaciones



//Nombre de archivo InterfazEjemplo.java
public interface InterfazEjemplo {
String metodo1();
}

____________________________________________________________________________________________

Y una clase que implementa esa interfaz

//Nombre Archivo ClaseEjemplo.java

//Implementacion de la Interfaz

import java.lang.reflect.Proxy;
public class ClaseEjemplo implements InterfazEjemplo{
public String metodo1() {
return "Hello World";
}
}

____________________________________________________________________________________________

Hay caso en los que es necesario hacer algo antes de llamara un metodo

por lo que necesitamos usar un proxy para llamar al metodo

//Nombre de archivo Main.java

//Aqui vemos el ejemplo de como Instancias un proxy a un objeto

public class Main {

public static void main(String []args) {
ClassLoader loader = InterfazEjemplo.class.getClassLoader();
InterfazEjemplo x = (InterfazEjemplo) Proxy.newProxyInstance(loader, new Class[]{InterfazEjemplo.class}, new MiInvocationHandler(new ClaseEjemplo()));
x.metodo1();
}
}


____________________________________________________________________________________________

Un InvocationHandler no permite crear un proxy para poder llamar a metodos de una clase de manera dinamica y realizar operaciones antes y despues de la ejecucion del metodo


A continuacion podemos ver como se implementa el InvocationHandler o como usar Relfection para llamar a los metodos y realizar operaciones antes de ejecutarlos



//Nombre de Archivo MiInvocationHandler.java

//Esta clase permite Escuchar las llamadas a metodos y podemos hacer cosas antes de llamarlos o despues de o manupular parametros o resultados

import java.lang.reflect.*;
public class MiInvocationHandler implements InvocationHandler{

InterfazEjemplo obj;

private MiInvocationHandler() {
super();
}
public MiInvocationHandler(InterfazEjemplo obj) {
this();
this.obj = obj;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

Object res = null;
System.out.println("Llamando al metodo " + method.getName());
System.out.println("Antes de Ejecutar el metodo");
res = method.invoke(obj, args);
System.out.println("res = " + res);
System.out.println("Despues de Ejecutar el metodo");

return res;
}

}


Espero que esta informacion sea util, proximamente voy a agregar mas informacion acerca de esto para cubrir las dudas


No hay comentarios: