Design Patterns J2EE - Business Delegate
----------------------------------------

Demorou mas saiu!

Nome: Business Delegate

Outros nomes: Client Facade, Session Proxy

Contexto: Aplicação cliente necessita acessar serviços de uma Session Facade (poderia ser qualquer outro tipo de EJB, mas é bom para que percebam como os patterns se relacionam)

Problema: Vários passos são necessários para a utilização dos serviços da Session Facade (ou qualquer outro EJB). Veja na classe abaixo:

/**
* Cliente que NÃO USA Business Delegate
* @author alegomes
*/
class ClienteSemBusinessDelegate
{
void metodo()
{
//Passsos para a utilização dos serviços de uma Session Facade
Context ctx = new InitialContext();
Object ref = ctx.lookup("SessionFacade");
SessionFacadeHome home = (SessionFacadeHome)
PortableRemoteObject.narrow(ref, SessionFacadeHome.class);
SessionFacade sf = home.create();
sf.servico1();
}
}

Esta sequência de tarefas, além de tornar complexa a aplicação cliente, cria dependências diretas entre a camada de apresentação e a tecnologia utilizada na camada de negócios. Caso fosse necessário alterar a tecnologia dos componentes de negócios, toda a aplicação cliente haveria de sofrer modificações, pois aquele código é específico para EJB.

Solução: Ocultar da aplicação cliente todos os detalhes específicos da tecnologia utilizada na construção dos componentes de negócio.

+---------+ +----------+ +---------+
| | | | | |
| Cliente | -----> | Business | -----> | Session |
| | | Delegate | | Facade |
+---------+ +----------+ +---------+

Consequências:
+ Maior desacoplamento entre as camadas
+ Simplifica o código cliente
+ Incrementa a performance na medida em que se pode implementar mecanismos de cache no Business Delegate

Estratégias: Para cada Session Facade, implementar uma classe local com a mesma interface de serviços.

Exemplo:
/**
* Session Facade * @author alegomes
*/
class SessionFacade implements SessionBean
{
//métodos ejb

//métodos de negócio
void servico1()
{
//Implementação do serviço 1 }

void servico2()
{
//Implementação do serviço 2
}
}

/**
* Business Delegate
* @author alegomes
*/
class BusinessDelegate
{
SessionFacadeHome home;

//Construtor
BusinessDelegate()
{
Context ctx = new InitialContext();
Object ref = ctx.lookup("SessionFacade");
home = (SessionFacadeHome)PortableRemoteObject.narrow(ref, SessionFacadeHome.class);
}

//métodos de negócio

void servico1()
{
SessionFacade sf = home.create();
sf.servico1();
}

void servico2()
{
SessionFacade sf = home.create();
sf.servico2();
}
}


/**
* Cliente que USA Business Delegate para realização de "metodo"
* @author alegomes
*/
class ClienteComBusinessDelegate
{
BusinessDelegate bd;

ClienteComBusinessDelegate()
{
bd = new BusinessDelegate();
}

void metodo()
{ bd.servico1();
}
}

Usando o Business Delegate, o código cliente só enxerga invocações locais, e toda a complexidade das chamadas remotas ficam ocultas dentro dele. Além de facilitar o desenvolvimento da aplicação cliente, o uso do Business Delegate desata as amarras entre as camada de apresentação e a tecnologia da camada de negócio. Caso haja a necessidade de migrar de EJB para qualquer outra tecnologia de componentes de negócios, a aplicação cliente permaneceria intacta, ficando as consequências limitadas apenas nos Business Delegates.

Próximo design pattern J2EE: Service Locator

Bons patterns !!!

Alexandre Gomes
Sou Jedi, Sou Java!



================================================================================
[dicas-list] circula diariamente com pequenas dicas sobre a plataforma Java e é
mais um serviço da Sociedade de Usuários Java - http://www.soujava.org.br
*** SouJava - Fortalecendo a Comunidade Java Brasileira! ***
- Para contribuir com uma dica, envie um e-mail para [EMAIL PROTECTED]
- Participe de outras listas de discussão sobre a linguagem Java.
Saiba mais em http://www.soujava.org.br/lista.htm
--------------------------------------------------------------------------------
- Para assinar este boletim: mailto:dicas-list-subscribe@;soujava.org.br
- Para cancelar sua assinatura: mailto:dicas-list-unsubscribe@;soujava.org.br
- Dicas anteriores: http://www.mail-archive.com/dicas-list%40soujava.org.br
- Para discutir sobre as dicas, acesse o Mundo OO (http://www.mundooo.com.br)


Responder a