Criando um proxy dinâmicamente

Bom, o padrão proxy tem como objetivo prover um representante de um comportamento, com a finalizade de modificar alguns comportamentos antes ou depois de executar o método da classe real.

Exemplo do padrãp Proxy

Padrão Proxy

Então temos uma classe cliente que conhece uma interface e irá utilizar seu métodos, que é o que enteressa para ela. Porém podem surgir alguns requisitos não funcionais como gerar logs. Desta forma ou vc altera todos os métodos ou vc cria um proxy que vai tanto registrar os logs como chamar o método original que o cliente espera.

O exemplo que segue vai mostrar como criar dinâmicamente um proxy para ser utilizado por exemplo por uma Factory.

Vamos criar algumas classes:
Client: É a classe que vai consumir o método.
IDao: Interface que possui a assinatura do método.
RealDao: É a classe final que implementa a funcionalidade prometiada pela interface.
DynamicProxy: Esta classe é responsável por criar um Proxy que vai escrever no console antes e depois da execução de qualquer médoto de IDao.

A interface IDao apenas cria o contrato que todas classes que a implementarem terão os 3 métodos abaixo.

package com.wordpress.robsonximenes.pattern.proxy;

public interface IDao {
public void insert();
public void update();
public void delete();
}

A classe RealDao implementa os métodos da interface IDao. Apenas imprimindo no console o nome do método.

package com.wordpress.robsonximenes.pattern.proxy;

public class RealDao implements IDao {

public void insert() {
System.out.println(“Insert…”);
}
public void delete() {
System.out.println(“Delete…”);
}
public void update() {
System.out.println(“Update…”);
}
}

Agora vem a classe que realiza dinamicamente o proxy, pois ele representará RealDao adicionando comportamentos antes e depois de cada método.

package com.wordpress.robsonximenes.pattern.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy implements InvocationHandler {

IDao realDao;

public DynamicProxy(IDao obj) {
this.realDao = obj;
}

/* Cada método executado passará por aqui */
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
Object o;
try {
//Before
System.out.println(“>>>> Ivoking “+m.getName());
o = m.invoke(realDao, args);
//After
System.out.println(“<<<< Ivoked “+m.getName());
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw e;
}
return o;
}

/* Método de criação do Proxy */
public static IDao newInstance(IDao concrete, Class[] interfaces){
return (IDao)Proxy.newProxyInstance(concrete.getClass().getClassLoader(), interfaces,new DynamicProxy(concrete));
}

}

E por fim a classe client que consumirá a execuçao da classe RealDao. Observem que a forma como estamos obtendo o Proxy poderia ser substituida por uma factory deixando transparente o uso do Proxy.

package com.wordpress.robsonximenes.pattern.proxy;

public class Client {

// Instanciating DAO (should remove this to a factory)
IDao dao = DynamicProxy.newInstance(new RealDao(),new Class[]{IDao.class});

// Call the insert method
public static void main(String[] args) {
Client client = new Client();
client.dao.insert();
client.dao.update();
client.dao.delete();
}
}

Após a execução da classe Client é esperado o seguinte resultado:

>>>> Ivoking insert
Insert...
<<<>>> Ivoking update
Update...
<<<>>> Ivoking delete
Delete...
<<<< Ivoked delete

Anúncios

Sobre Robson Ximenes
Baiano, torcedor o Bahia. Bacharel em Ciências da computação, jogador de futebol e tênis nas horas vagas.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: