b'\n_START_ARTICLE_\nBusiness delegate\n_START_PARAGRAPH_\nBusiness delegate \xc3\xa9 um padr\xc3\xb5es de projeto da engenharia de software, utilizado para aplicativos multicamadas. O padr\xc3\xa3o projeto de Delega\xc3\xa7\xc3\xa3o de Neg\xc3\xb3cio do ingl\xc3\xaas "Business Delegate" \xc3\xa9 usado para separar a camada de apresenta\xc3\xa7\xc3\xa3o/externa das regras/l\xc3\xb3gicas de neg\xc3\xb3cio. A raz\xc3\xa3o para utilizar essa abordagem \xc3\xa9 reduzir o acoplamento entre as camadas, porque o alto acoplamento pode causar v\xc3\xa1rios problemas no projeto, recomendado na Java EE como padr\xc3\xa3o de projeto. _NEWLINE_O acoplamento alto geralmente impede uma boa manuten\xc3\xa7\xc3\xa3o, gera o desenvolvimento adicional das v\xc3\xa1rias camadas, dificulta substitui\xc3\xa7\xc3\xa3o dos componentes de tecnologia. Al\xc3\xa9m disso, a camada de apresenta\xc3\xa7\xc3\xa3o fica inst\xc3\xa1vel para grandes mudan\xc3\xa7as na camada de neg\xc3\xb3cios. Para evitar isso, o modelo de design/projeto "Business Delegate" \xc3\xa9 indicado. Este padr\xc3\xa3o oculta os detalhes internos da implementa\xc3\xa7\xc3\xa3o da l\xc3\xb3gica de neg\xc3\xb3cios (por exemplo, consulta de JNDI , RMI , acesso a EJBs, Gerente/Manager de objetos afins ) para a camada de apresenta\xc3\xa7\xc3\xa3o. Como o nome delegador sugere, aqui as fun\xc3\xa7\xc3\xb5es de acesso s\xc3\xa3o encapsuladas e encaminhadas._NEWLINE_A vantagem \xc3\xa9 que a camada de apresenta\xc3\xa7\xc3\xa3o pode ser trocada mais facilmente, o que \xc3\xa9 especialmente \xc3\xbatil para diferentes dispositivos. A classe Business Delegate tamb\xc3\xa9m pode armazenar os resultados em memoria, desta forma melhorar significativamente o poder de computa\xc3\xa7\xc3\xa3o. tamb\xc3\xa9m as exce\xc3\xa7\xc3\xb5es muito t\xc3\xa9cnicas podem ser convertidas em exce\xc3\xa7\xc3\xb5es mais f\xc3\xa1ceis de entender para o usu\xc3\xa1rio._NEWLINE_Caso preciso ser feitas altera\xc3\xa7\xc3\xb5es na implementa\xc3\xa7\xc3\xa3o da camada de neg\xc3\xb3cios, n\xc3\xa3o ser\xc3\xa1 mais necess\xc3\xa1rio alterar todos os elementos da camada de apresenta\xc3\xa7\xc3\xa3o, mas apenas as classes de delega\xc3\xa7\xc3\xa3o de neg\xc3\xb3cios._NEWLINE_Geralmente, h\xc3\xa1 tamb\xc3\xa9m uma classe de interface de neg\xc3\xb3cios nesse contexto, que especifica as funcionalidades dispon\xc3\xadveis das classes Business Delegate para a pr\xc3\xb3xima camada. Isso possibilita fornecer v\xc3\xa1rias/dimens\xc3\xb5es da implementa\xc3\xa7\xc3\xa3o do padr\xc3\xa3o de delega\xc3\xa7\xc3\xa3o de neg\xc3\xb3cios._NEWLINE_Diferen\xc3\xa7as do padr\xc3\xa3o Fa\xc3\xa7ade, este padr\xc3\xa3o \xc3\xa9 gen\xc3\xa9rico para unificar uma invoca\xc3\xa7\xc3\xa3o. \xc3\x89 um padr\xc3\xa3o para diminuir invoca\xc3\xa7\xc3\xb5es, simplificar o de API. A sua fun\xc3\xa7\xc3\xa3o principal n\xc3\xa3o \xc3\xa9 desacoplamento embora isso possa decorrer naturalmente. O Business Delegate \xc3\xa9 um padr\xc3\xa3o JEE e funciona como um agente destacado um Manager. \xc3\x89 um objeto que conhece o negocio mas n\xc3\xa3o est\xc3\xa1 no dispon\xc3\xadvel no servidor, ele sabe como e o qu\xc3\xaa delegar ao servidor. Ele est\xc3\xa1 mais para Mediator, mas do ponto de vista do cliente ele parece um Fa\xc3\xa7ade por tamb\xc3\xa9m ficar entre o servidor._NEWLINE_O Fa\xc3\xa7ade \xc3\xa9 gen\xc3\xa9rico, o Business Delegate \xc3\xa9 especifico para arquitetura JEE e normalmente faz orquestra\xc3\xa7\xc3\xa3o de objetos com o servidor e n\xc3\xa3o apenas invocar m\xc3\xa9todos de negocio._NEWLINE_N\xc3\xa3o \xc3\xa9 correto dizer que um Business Delegate \xc3\xa9 um Fa\xc3\xa7ade, mas tamb\xc3\xa9m n\xc3\xa3o \xc3\xa9 correto dizer que n\xc3\xa3o pare\xc3\xa7a com Fa\xc3\xa7ade. S\xc3\xa3o dois padr\xc3\xb5es de "mundos" diferentes. Ent\xc3\xa3o eles est\xc3\xa3o relacionados concetualmente, embora n\xc3\xa3o tenham nada em comum na hora de implementar.\n_START_SECTION_\nC\xc3\xb3digo de exemplo\n_START_PARAGRAPH_\nUm c\xc3\xb3digo de exemplo para um Aplicativo de Servi\xc3\xa7os Profissionais (PSA), no qual um cliente da camada da Web precisa acessar um bean de sess\xc3\xa3o que implementa o padr\xc3\xa3o de fachada da sess\xc3\xa3o, \xc3\xa9 implementado conforme abaixo._NEWLINE_Resource Delegate:_NEWLINE_public class ResourceDelegate {_NEWLINE__NEWLINE_  // Remote reference for Session Facade_NEWLINE_  private ResourceSession session;_NEWLINE__NEWLINE_  // Class for Session Facade\'s Home object_NEWLINE_  private static final Class homeClazz =_NEWLINE_  corepatterns.apps.psa.ejb.ResourceSessionHome.class;_NEWLINE__NEWLINE_  // Default Constructor. Looks up home and connects_NEWLINE_  // to session by creating a new one_NEWLINE_  public ResourceDelegate() throws ResourceException {_NEWLINE_    try {_NEWLINE_      ResourceSessionHome home = (ResourceSessionHome)_NEWLINE_        ServiceLocator.getInstance().getHome(_NEWLINE_          "Resource", homeClazz);_NEWLINE_      session = home.create();_NEWLINE_    } catch(ServiceLocatorException ex) {_NEWLINE_      // Translate Service Locator exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    } catch(CreateException ex) {_NEWLINE_      // Translate the Session create exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      // Translate the Remote exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE__NEWLINE_  public BusinessDelegate(String id)_NEWLINE_    throws ResourceException {_NEWLINE_    super();_NEWLINE_    reconnect(id);_NEWLINE_  }_NEWLINE__NEWLINE__NEWLINE_  public String getID() {_NEWLINE_    try {_NEWLINE_      return ServiceLocator.getId(session);_NEWLINE_    } catch (Exception e) {_NEWLINE_      // Throw an application exception_NEWLINE_    }_NEWLINE_ }_NEWLINE__NEWLINE_  public void reconnect(String id)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      session = (ResourceSession)_NEWLINE_                ServiceLocator.getService(id);_NEWLINE_    } catch (RemoteException ex) {_NEWLINE_      // Translate the Remote exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE__NEWLINE_  public ResourceTO setCurrentResource(_NEWLINE_    String resourceId)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      return session.setCurrentResource(resourceId);_NEWLINE_    } catch (RemoteException ex) {_NEWLINE_      // Translate the service exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  public ResourceTO getResourceDetails()_NEWLINE_    throws ResourceException {_NEWLINE__NEWLINE_    try {_NEWLINE_      return session.getResourceDetails();_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      // Translate the service exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  public void setResourceDetails(ResourceTO vo)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      session.setResourceDetails(vo);_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  public void addNewResource(ResourceTO vo)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      session.addResource(vo);_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  // all other proxy method to session bean_NEWLINE_  ...}_NEWLINE_Remote interface for ResouceSession:_NEWLINE_public class ResourceDelegate {_NEWLINE__NEWLINE_  // Remote reference for Session Facade_NEWLINE_  private ResourceSession session;_NEWLINE__NEWLINE_  // Class for Session Facade\'s Home object_NEWLINE_  private static final Class homeClazz =_NEWLINE_  corepatterns.apps.psa.ejb.ResourceSessionHome.class;_NEWLINE__NEWLINE_  // Default Constructor. Looks up home and connects_NEWLINE_  // to session by creating a new one_NEWLINE_  public ResourceDelegate() throws ResourceException {_NEWLINE_    try {_NEWLINE_      ResourceSessionHome home = (ResourceSessionHome)_NEWLINE_        ServiceLocator.getInstance().getHome(_NEWLINE_          "Resource", homeClazz);_NEWLINE_      session = home.create();_NEWLINE_    } catch(ServiceLocatorException ex) {_NEWLINE_      // Translate Service Locator exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    } catch(CreateException ex) {_NEWLINE_      // Translate the Session create exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      // Translate the Remote exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  public BusinessDelegate(String id)_NEWLINE_    throws ResourceException {_NEWLINE_    super();_NEWLINE_    reconnect(id);_NEWLINE_  }_NEWLINE__NEWLINE_  public String getID() {_NEWLINE_    try {_NEWLINE_      return ServiceLocator.getId(session);_NEWLINE_    } catch (Exception e) {_NEWLINE_      // Throw an application exception_NEWLINE_    }_NEWLINE_ }_NEWLINE__NEWLINE_  public void reconnect(String id)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      session = (ResourceSession)_NEWLINE_                ServiceLocator.getService(id);_NEWLINE_    } catch (RemoteException ex) {_NEWLINE_      // Translate the Remote exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE__NEWLINE_  public ResourceTO setCurrentResource(_NEWLINE_    String resourceId)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      return session.setCurrentResource(resourceId);_NEWLINE_    } catch (RemoteException ex) {_NEWLINE_      // Translate the service exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  public ResourceTO getResourceDetails()_NEWLINE_    throws ResourceException {_NEWLINE__NEWLINE_    try {_NEWLINE_      return session.getResourceDetails();_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      // Translate the service exception into_NEWLINE_      // application exception_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  public void setResourceDetails(ResourceTO vo)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      session.setResourceDetails(vo);_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  public void addNewResource(ResourceTO vo)_NEWLINE_    throws ResourceException {_NEWLINE_    try {_NEWLINE_      session.addResource(vo);_NEWLINE_    } catch(RemoteException ex) {_NEWLINE_      throw new ResourceException(...);_NEWLINE_    }_NEWLINE_  }_NEWLINE__NEWLINE_  // all other proxy method to session bean_NEWLINE_  ...}'