Business delegate
Business delegate é um padrões de projeto da engenharia de software, utilizado para aplicativos multicamadas. O padrão projeto de Delegação de Negócio do inglês "Business Delegate" é usado para separar a camada de apresentação/externa das regras/lógicas de negócio. A razão para utilizar essa abordagem é reduzir o acoplamento entre as camadas, porque o alto acoplamento pode causar vários problemas no projeto, recomendado na Java EE como padrão de projeto. [1]
O acoplamento alto geralmente impede uma boa manutenção, gera o desenvolvimento adicional das várias camadas, dificulta substituição dos componentes de tecnologia. Além disso, a camada de apresentação fica instável para grandes mudanças na camada de negócios. Para evitar isso, o modelo de design/projeto "Business Delegate" é indicado. Este padrão oculta os detalhes internos da implementação da lógica de negócios (por exemplo, consulta de JNDI , RMI , acesso a EJBs, Gerente/Manager de objetos afins ) para a camada de apresentação. Como o nome delegador sugere, aqui as funções de acesso são encapsuladas e encaminhadas.
A vantagem é que a camada de apresentação pode ser trocada mais facilmente, o que é especialmente útil para diferentes dispositivos. A classe Business Delegate também pode armazenar os resultados em memoria, desta forma melhorar significativamente o poder de computação. também as exceções muito técnicas podem ser convertidas em exceções mais fáceis de entender para o usuário.
Caso preciso ser feitas alterações na implementação da camada de negócios, não será mais necessário alterar todos os elementos da camada de apresentação, mas apenas as classes de delegação de negócios.
Geralmente, há também uma classe de interface de negócios nesse contexto, que especifica as funcionalidades disponíveis das classes Business Delegate para a próxima camada. Isso possibilita fornecer várias/dimensões da implementação do padrão de delegação de negócios.
Diferenças do padrão Façade, este padrão é genérico para unificar uma invocação. É um padrão para diminuir invocações, simplificar o de API. A sua função principal não é desacoplamento embora isso possa decorrer naturalmente. O Business Delegate é um padrão JEE e funciona como um agente destacado um Manager. É um objeto que conhece o negocio mas não está no disponível no servidor, ele sabe como e o quê delegar ao servidor. Ele está mais para Mediator, mas do ponto de vista do cliente ele parece um Façade por também ficar entre o servidor.
O Façade é genérico, o Business Delegate é especifico para arquitetura JEE e normalmente faz orquestração de objetos com o servidor e não apenas invocar métodos de negocio.
Não é correto dizer que um Business Delegate é um Façade, mas também não é correto dizer que não pareça com Façade. São dois padrões de "mundos" diferentes. Então eles estão relacionados concetualmente, embora não tenham nada em comum na hora de implementar.
Código de exemplo
editarUm código de exemplo para um Aplicativo de Serviços Profissionais (PSA), no qual um cliente da camada da Web precisa acessar um bean de sessão que implementa o padrão de fachada da sessão, é implementado conforme abaixo.
Resource Delegate:
public class ResourceDelegate {
// Remote reference for Session Facade
private ResourceSession session;
// Class for Session Facade's Home object
private static final Class homeClazz =
corepatterns.apps.psa.ejb.ResourceSessionHome.class;
// Default Constructor. Looks up home and connects
// to session by creating a new one
public ResourceDelegate() throws ResourceException {
try {
ResourceSessionHome home = (ResourceSessionHome)
ServiceLocator.getInstance().getHome(
"Resource", homeClazz);
session = home.create();
} catch(ServiceLocatorException ex) {
// Translate Service Locator exception into
// application exception
throw new ResourceException(...);
} catch(CreateException ex) {
// Translate the Session create exception into
// application exception
throw new ResourceException(...);
} catch(RemoteException ex) {
// Translate the Remote exception into
// application exception
throw new ResourceException(...);
}
}
public BusinessDelegate(String id)
throws ResourceException {
super();
reconnect(id);
}
public String getID() {
try {
return ServiceLocator.getId(session);
} catch (Exception e) {
// Throw an application exception
}
}
public void reconnect(String id)
throws ResourceException {
try {
session = (ResourceSession)
ServiceLocator.getService(id);
} catch (RemoteException ex) {
// Translate the Remote exception into
// application exception
throw new ResourceException(...);
}
}
public ResourceTO setCurrentResource(
String resourceId)
throws ResourceException {
try {
return session.setCurrentResource(resourceId);
} catch (RemoteException ex) {
// Translate the service exception into
// application exception
throw new ResourceException(...);
}
}
public ResourceTO getResourceDetails()
throws ResourceException {
try {
return session.getResourceDetails();
} catch(RemoteException ex) {
// Translate the service exception into
// application exception
throw new ResourceException(...);
}
}
public void setResourceDetails(ResourceTO vo)
throws ResourceException {
try {
session.setResourceDetails(vo);
} catch(RemoteException ex) {
throw new ResourceException(...);
}
}
public void addNewResource(ResourceTO vo)
throws ResourceException {
try {
session.addResource(vo);
} catch(RemoteException ex) {
throw new ResourceException(...);
}
}
// all other proxy method to session bean
...
}
Remote interface for ResouceSession:
public class ResourceDelegate {
// Remote reference for Session Facade
private ResourceSession session;
// Class for Session Facade's Home object
private static final Class homeClazz =
corepatterns.apps.psa.ejb.ResourceSessionHome.class;
// Default Constructor. Looks up home and connects
// to session by creating a new one
public ResourceDelegate() throws ResourceException {
try {
ResourceSessionHome home = (ResourceSessionHome)
ServiceLocator.getInstance().getHome(
"Resource", homeClazz);
session = home.create();
} catch(ServiceLocatorException ex) {
// Translate Service Locator exception into
// application exception
throw new ResourceException(...);
} catch(CreateException ex) {
// Translate the Session create exception into
// application exception
throw new ResourceException(...);
} catch(RemoteException ex) {
// Translate the Remote exception into
// application exception
throw new ResourceException(...);
}
}
public BusinessDelegate(String id)
throws ResourceException {
super();
reconnect(id);
}
public String getID() {
try {
return ServiceLocator.getId(session);
} catch (Exception e) {
// Throw an application exception
}
}
public void reconnect(String id)
throws ResourceException {
try {
session = (ResourceSession)
ServiceLocator.getService(id);
} catch (RemoteException ex) {
// Translate the Remote exception into
// application exception
throw new ResourceException(...);
}
}
public ResourceTO setCurrentResource(
String resourceId)
throws ResourceException {
try {
return session.setCurrentResource(resourceId);
} catch (RemoteException ex) {
// Translate the service exception into
// application exception
throw new ResourceException(...);
}
}
public ResourceTO getResourceDetails()
throws ResourceException {
try {
return session.getResourceDetails();
} catch(RemoteException ex) {
// Translate the service exception into
// application exception
throw new ResourceException(...);
}
}
public void setResourceDetails(ResourceTO vo)
throws ResourceException {
try {
session.setResourceDetails(vo);
} catch(RemoteException ex) {
throw new ResourceException(...);
}
}
public void addNewResource(ResourceTO vo)
throws ResourceException {
try {
session.addResource(vo);
} catch(RemoteException ex) {
throw new ResourceException(...);
}
}
// all other proxy method to session bean
...
}
Referências
- ↑ a b c «Core J2EE Patterns - Business Delegate». Oracle. Oracle. Consultado em 22 de junho de 2016