Business delegate is aJava EE design pattern.[1] This pattern is directed towards reducing thecoupling in between business services and the connected presentation tier, and to hide the implementation details of services (including lookup and accessibility ofEJB architecture).[1][2] Business delegates acts as an adaptor to invoke business objects from the presentation tier.[3]
Requests to access underlying business services are sent from clients, and lookup services are used by business delegates to locate the business service components.[1]
Basic components are Business delegate, Lookup service and business service.
Control and protection are provided through business delegate which can have two types of structures, without ID and with ID, where ID is a string version of the reference to a remote object such as EJBHome or EJBObject.[1]
Business service is located by lookup service which is used by the business delegate. The implementation details of business service lookup is encapsulated by lookup service.[1]
This a business-tier component, such as an enterprise bean or a JMS component, which provides the required service to the client.[1]
Some consequences are as follows:
Following concerns can be considered:
A sample code for a Professional Services Application (PSA), where a Web-tier client needs to access a session bean that implements the session facade pattern, is provided below.
Resource Delegate:
publicclassResourceDelegate{// Remote reference for Session FacadeprivateResourceSessionsession;// Class for Session Facade's Home objectprivatestaticfinalClasshomeClazz=corepatterns.apps.psa.ejb.ResourceSessionHome.class;// Default Constructor. Looks up home and connects// to session by creating a new onepublicResourceDelegate()throwsResourceException{try{ResourceSessionHomehome=(ResourceSessionHome)ServiceLocator.getInstance().getHome("Resource",homeClazz);session=home.create();}catch(ServiceLocatorExceptionex){// Translate Service Locator exception into// application exceptionthrownewResourceException(...);}catch(CreateExceptionex){// Translate the Session create exception into// application exceptionthrownewResourceException(...);}catch(RemoteExceptionex){// Translate the Remote exception into// application exceptionthrownewResourceException(...);}}publicBusinessDelegate(Stringid)throwsResourceException{super();reconnect(id);}publicStringgetID(){try{returnServiceLocator.getId(session);}catch(Exceptione){// Throw an application exception}}publicvoidreconnect(Stringid)throwsResourceException{try{session=(ResourceSession)ServiceLocator.getService(id);}catch(RemoteExceptionex){// Translate the Remote exception into// application exceptionthrownewResourceException(...);}}publicResourceTOsetCurrentResource(StringresourceId)throwsResourceException{try{returnsession.setCurrentResource(resourceId);}catch(RemoteExceptionex){// Translate the service exception into// application exceptionthrownewResourceException(...);}}publicResourceTOgetResourceDetails()throwsResourceException{try{returnsession.getResourceDetails();}catch(RemoteExceptionex){// Translate the service exception into// application exceptionthrownewResourceException(...);}}publicvoidsetResourceDetails(ResourceTOvo)throwsResourceException{try{session.setResourceDetails(vo);}catch(RemoteExceptionex){thrownewResourceException(...);}}publicvoidaddNewResource(ResourceTOvo)throwsResourceException{try{session.addResource(vo);}catch(RemoteExceptionex){thrownewResourceException(...);}}// all other proxy method to session bean...}