Professional Documents
Culture Documents
Contexto
Enterprise beans encapsulam a lgica e os dados do negcio e expe suas interfaces e, assim, a
complexidade dos servios distribudos, para a nvel do cliente.
Problemas
Em uma Java 2 Plataform de mltiplos nveis, do ambiente de aplicao Enterprise Edition (J2EE), surgem
os seguintes problemas:
- Forte acoplamento, que leva a uma dependncia direta entre os clientes e os objetos de negcio;
- Muitas invocaes de mtodos entre cliente e servidor levam a problemas de performance de rede;
- A falta de uma estratgia uniforme de acesso do cliente, expe os objetos de negcio a usos indevidos.
Uma aplicao multicamadas J2EE tem inmeros objetos no lado do servidor, que so implementadas como
enterprise beans. Alm disso, alguns outros objetos arbitrrios devem prover servios, dados ou ambos,
lgica e dados do negcio. Esses objetos so coletivamente tratados como objetos de negcio, uma vez que
encapsulam os dados e a lgica do negcio.
Aplicaes J2EE implementam objetos de negcio que fornecem servios de processamento como session
beans. Objetos de negcio mais genricos (coarse-grained), que representam uma object view de
persistncia (persistent storage) e so compartilhados por vrios usurios so, geralmente, implementados
como entity beans.
Aplicaes cliente precisam acessar os objetos de negcio para cumprir suas responsabilidades e atender s
necessidades do usurio. Clientes podem interagir diretamente com estes objetos de negcio, porque eles
expe suas interfaces. Quando voc expe objetos de negcio para o cliente, o cliente deve compreender e
ser responsvel pelas relaes entre objetos de dados de negcio e devem ser capazes de lidar com o fluxo
de processo do negcio.
No entanto, a interao direta entre cliente e objetos de negcio leva a um alto nvel de acoplamento entre os
dois e tal nvel de acoplamento faz com que o cliente se torne diretamente dependente da implementao
dos objetos de negcio. Essa dependncia direta significa que o cliente deve representar e implementar as
interaes complexas relativas (regarding) s pesquisas e criaes dos objetos de negcio e devem gerenciar
os relacionamentos entre os objetos de negcio participantes, bem como compreender a responsabilidade de
demarcao da transao.
Como as requisies dos clientes aumentam, a complexidade da interao entre vrios objetos de negcio,
aumenta. O cliente cresce e se torna cada vez mais complexo para cumprir com essas exigncias e, assim,
torna-se muito sustetvel a mudanas na camada dos objetos de negcio. Alm disso, o cliente exposto,
desnecessariamente, complexidade do sistema subjacente.
Tambm ocorre o forte acoplamento quando objetos gerenciam suas relaes internamente. Frequentemente,
no fica claro onde a relao gerenciada. Isto leva a uma relao complexa entre objetos de negcio e e
rigidez na aplicao. Essa falta de flexibilidade torna a aplicao menos gerencivel quando mudanas se
tornam necessrias.
Ao acessar os enterprise beans, os clientes interagem com objetos remotos. Quando clientes interagem
diretamente com todos os objetos de negcio participantes, podem surgir problemas de desempenho de rede.
Ao chamar enterprise beans, cada invocao do cliente , potencialmente, uma chamada de mtodo remoto
(RMI). Cada acesso a um objeto de negcio se torna relativamente mais especfica (fine-grained). Como o
nmero de participantes aumenta neste cenrio, o nmero de chamadas para cada mtodo remoto tambm
aumenta. Como o nmero de mtodos remotos tende a aumentar, a conversao (chattiness) entre o cliente e
os objetos no lado do servidor, aumentam. Isto pode resultar na degradao do desempenho da rede para a
aplicao, porque o alto volume das chamadas de mtodo remoto aumentam a quantidade de interao
atravs da camada de rede.
Um problema tambm surge quando um cliente interage diretamente com os objetos de negcio. Uma vez
que os objetos de negcio so expostos diretamente aos cliente, no existe uma estratgia unificada para
acessar os objetos de negcio. Sem uma estratgia de acesso do cliente que seja uniforme, os objetos de
negcio so expostos aos cliente e podem reduzir a consistncia da utilizao.
Vantagens (Forces)
- Fornecer uma interface mais simples para os clientes, ocultando todas as interaes complexas entre
componentes de negcio.
- Reduzir o nmero de objetos de negcio que so expostos para o cliente atravs da camada de servios da
rede.
- Esconder do cliente as interaes subjacentes e interdependncias entre os componentes de negcio. Isto
proporciona uma melhor capacidade de gerenciamento, a centralizao das interaes (responsabilidades),
maior flexibilidade e maior capacidade de lidar com as mudanas.
- Fornecer uma camada de servio uniforme mais genrica, para implementao de objetos de negcio,
separada da abstrao de servios de negcio.
- Evitar expor, diretamente para o cliente, os objetos de negcio subjacentes, reduzindo o acoplamento entre
camadas distintas ao mnimo possvel.
Soluo
Usar uma session bean como uma fachada (facade) para encapsular a complexidae das interaes entre os
objetos de negcio que participam de um fluxo de trabalho. A facade session gerencia os objetos de negcio
e fornece aos clientes uma camada de acesso uniforme mais genrica.
A Facade Session abstrai as interaes entre objetos de negcio subjacentes e fornece uma camada de
servio que expe apenas as interfaces necessrias. Assim, ela oculta do cliente as complexas interaes
entre os participantes. A Facade Session gerencia as interaes entre os objetos de dados e de servios de
negcio que participam do fluxo de trabalho e encapsula a lgica de negcio associada com as solicitaes
requeridas. Assim, o session bean (que representa uma Facade Session) gerencia as relaes entre objetos de
negcio. O session bean tambm gerencia o ciclo de vida desses participantes, criando, localizando (looking
up), modificando e excluindo-os, conforme exigido pelo fluxo de trabalho. Em uma aplicao complexa, a
Facade Session pode delegar essa gesto do ciclo/estilo de vida para um objeto separado. Por exemplo, para
gerenciar o ciclo/estilo de vida da participant session e entity beans, a Facade Session pode delegar o
trabalho para um objeto Service Locator (veja "Service Locator" na pgina 368).
importante examinar a relao entre os objetos de negcio. Algumas relaes entre objetos de negcio so
transitrias (transients), o que significa que a relao aplicvel apenas para aquela interao ou cenrio.
Outras relaes podem ser mais permanentes. Relaes transitrias (transient) melhor modeladas como
fluxo de trabalho em uma fachada, onde a fachada gerencia os relacionamentos entre os objetos de negcio.
Relaes permanentes entre dois objetos de negcio devem ser estudadas para determinar qual objeto de
negcio (se no ambos os objetos) mantm o relacionamento.
Casos de uso e Facade Sessions
Ento, como voc identifica as Facade Sessions atravs do estudo de casos de uso? Mapear cada caso de
uso a uma Facade Session ir resultar em muitas fachadas. Isto destri a inteno de ter menos session
beans genricos. Em vez disso, como voc deriva a Facade Session durante a modelagem, buscando
consolida-la no menor nmero de session beans baseadas em algum particionamento de lgica.
Por exemplo, para uma aplicao bancria, voc pode agrupar as interaes relacionadas ao gerenciamento
de uma conta em uma nica fachada. Os casos de uso 'Criar Nova Conta', 'Alterar Informaes de Conta',
Exibir Informaes de Conta' e, assim por diante, todo o negcio com a entity beans genrica 'conta'. Criar
uma fachada para cada caso de uso no recomendado. Assim, as funes necessrias para apoiar esses
casos de uso relacionados poderiam ser agrupadas em uma nica fachada, chamada AcountSessionFacade.
Neste caso, uma fachada ir tornar-se um controlador altamente genrico com mtodos de alto nvel, que
podem facilitar a cada interao (isto , createNewAccount, changeAccount, getAccount). Portanto,
recomendamos que voc projete uma fachada para agregar um grupo de interaes relacionadas em uma
nica session. Isso resulta em menos fachadas para a aplicao e aproveita os benefcios do padro Facade
Session.
Estrutura
A Figura 8.15 mostra o diagrama de classe que representa o padro Facade Session.
Participantes e Colaboraes
A Figura 8.16 contm o diagrama de sequncia que mostra as interaes de uma fachada com dois entity
beans, um session bean, e um DAO, todos atuando como participantes no cumprimento da solicitao do
cliente.
Cliente
Representa o cliente de uma fachada, que precisa de acesso aos servios do negcio. Este cliente pode ser
outro session bean (Facade Session) na mesma camada de negcio ou um negcio delegado (consulte
"Business Delegate" na pgina 248) em outra camada.
SessionFacade
O SessionFacade implementado como um session bean. O SessionFacade gerencia as relaes entre os
vrios BusinessObjects e proporciona um alto nvel de abstrao para o cliente. O SessionFacade oferece
acesso genrico ao BusinessObject participantes representados pela invocao Invoke de uma session bean.
BusinessObject
O BusinessObject um role objet que facilita a aplicao de estratgias diferentes, tais como session beans,
entity beans e um DAO (consulte a prxima seo, "Estratgias"). O BusinessObject fornece dados e/ou
algum servio no diagrama de classes. O SessionFacade interage com vrias instncias de businessObject
para prestar o servio.
Estratgias
A Facade Session um objeto controlador da camada de negcio que controla as interaes entre o cliente e
os dados e objetos de servios do negcio que participam do atendimento da requisio. Em uma aplicao
complexa, pode haver numerosos fachadas, que podem intermediar clientes e estes objectos. Voc pode
identificar onde uma fachada pode ser til ao estudar os requisitos do cliente e interaes, tipicamente
documentadas em casos de uso e cenrios. Esta anlise permite identificar um controlador layer-composed
da Facade Session - que pode atuar como fachada para esses cenrios.
Esta seo explica diferentes estratgias para a implementao de uma Facade Session.
A fachada pode usar um ou mais DAOs diretamente, para representar os dados de negcio. Isso feito
quando o aplicativo to simples que no requer entity beans, ou quando a arquitetura do aplicativo
baseado apenas em session beans e no utiliza entity beans. Usar DAOs dentro do session beans simula
parcialmente a natureza persistente (persistent nature) dos entity beans.
A aplicao pode precisar dos servios prestados por um objeto Java arbitrrio (ou seja, um objeto que no
um enterprise bean ou de um DAO, embora um DAO possa ser visto como um tipo de objeto Java
arbitrrio). Em tais casos, a fachada acessa esse objeto Java arbitrrio para fornecer a funcionalidade
necessria.
Consequncias
Introduz uma camada que controla a camada de negcio
Sesso Fachadas pode representar uma camada de controle entre clientes e a camada de negcio, conforme
identificado por meio da modelagem de anlise. Uma fachada abrange as interaes entre o cliente e os
componentes de negcio. Em uma aplicao sofisticada, voc pode identificar inmeras Fachadas sesso
que podem intermedirio entre o cliente e os participantes objetos da camada de negcio. Para aplicaes
mais simples, pode-se sentir que uma fachada no est acrescentando muito valor, como pode agir para a
maioria de proxy as solicitaes do cliente para um nico componente de negcio. No entanto, como
aplicativos se tornam mais complexos ao longo do tempo, usando uma fachada na frente vai dar benefcio
numa fase posterior.
Expe interfaces uniformes
As interaes subjacentes entre os componentes de negcio podem ser muito complexas. Um padro Facade
Session abstrai esta complexidade e apresenta ao cliente uma interface mais simples, que fcil de entender
e usar. Ao aplicar uma fachada, voc pode criar uma camada de servio que expe interfaces mais simples
para o sistema como um todo. Assim, uma fachada fornece uma camada de acesso uniforme genrica a
todos os tipos de clientes e pode proteger e esconder os componentes de negcio subjacentes participantes.
Reduz o acoplamento, aumenta a capacidade de gerenciamento
Usar Facade Session separa os objetos de negcio dos clientes, reduzindo o acoplamento e a dependncia do
cliente sobre os objetos de negcio. melhor usar uma fachada para gerir o fluxo de trabalho entre os
objetos de negcio, ao invs de fazer os objetos de negcio cientes um do outro. Um objeto de negcio s
deve ser responsvel pela sua prpria gesto (lgica de dados). Interaes entre objetos inter-negcios
podem ser captadas em um fluxo de trabalho por uma fachada. Isto proporciona uma melhor capacidade de
gerenciamento, a centralizao das interaes (responsabilidade e workflow), maior flexibilidade e maior
capacidade de lidar com as mudanas.
A separao do fluxo de trabalho em uma fachada elimina a dependncia direta do cliente sobre os objetos
participantes e promove a flexibilidade de design. Embora as mudanas para os participantes podem exigir
mudanas na fachada, centralizando o fluxo de trabalho na fachada, estas mudanas sero mais manejveis.
Voc muda apenas a sesso de fachada, em vez de ter que mudar todos os clientes. Cdigo cliente tambm
fica mais simples, porque agora delega a responsabilidade do fluxo de trabalho para uma fachada. O cliente
j no administra as interaes complexas do fluxo de trabalho entre objetos de negcio, nem o cliente
ciente das interdependncias entre objetos de negcio.
Melhora o desempenho, reduz mtodos especficos
A Fachada tambm impacta no desempenho. Uma fachada reduz a sobrecarga de rede entre o cliente e o
servidor, porque o seu uso elimina a interao direta entre o cliente e os objetos de dados de negcio e de
servios de negcio. Em vez disso, todas as interaes so encaminhadas atravs da fachada de modo
genrico. A fachada e seus participantes esto mais prximos uns dos outros, tornando-a mais eficiente para
gerir as interaes entre os objetos participantes. Todas as transferncias de dados e chamadas de mtodo da
fachada para os participantes so, presume-se, atravs de uma rede de velocidade relativamente alta. O
desempenho da rede pode ainda ser ajustado para proporcionar o mximo de rendimento, aplicando o
padro Transfer Object para os objetos participantes, onde aplicvel.
Fornece acesso genrico
Uma fachada pretende ser uma abstrao altamente genrica do fluxo de trabalho. Assim, no desejvel ter
uma Fachada por interao de entity bean, o que representaria uma abstrao especfica, em vez de genrica.
Analisa a interao entre o cliente e os servios de aplicao, usando casos de uso e cenrios para
determinar a possibilidade de generalizao da fachada. Determina a generalidade ideal da fachada para a
aplicao dividindo a aplicao em subsistemas lgicos e proporcionando uma fachada para cada
subsistema. No entanto, fornecer uma nica fachada para a totalidade do sistema pode resultar em uma
sesso de fachada muito grande, cujos numerosos mtodos se tornariam ineficientes. Uma nica fachada
pode ser suficiente para aplicaes muito simples que no justifiquem subsistemas.
Centraliza o gerenciamento de segurana
Polticas de segurana para a aplicao pode ser gerida a nvel Sesso Fachada, uma vez que este o nvel
apresentado aos clientes. Por causa do acesso de genrica da Sesso Fachada, mais fcil e mais gerencivel
para definir polticas de segurana a este nvel, em vez de no nvel do componente de negcio participantes.
Os componentes de negcio oferecem pontos de controle refinado. mais fcil de gerenciar a segurana de
Fachadas de sesso que fornecem acesso de genrica, porque h relativamente menos mtodos de genrica a
ser geridos de forma segura.
Centraliza o controle de transao
Como a fachada representa o fluxo de trabalho para os casos de uso, mais lgico aplicar o gerenciamento
de transaes no nvel Facade Session. Controle de transao centralizada tem vantagens semelhantes a
segurana centralizada. A fachada oferece um local central para o gerenciamento e definio de controle de
transao de uma forma genrica. muito mais trabalhoso fazer gerenciamento de transaes
individualmente nos componentes de negcio participantes, especialmente porque eles so mais especficos
do que a fachada. Alm disso, no usar uma fachada e dar ao cliente acesso s enterprise beans diretamente,
coloca o nus de demarcao da transao no cliente e pode produzir resultados indesejados.
Expe menos interfaces remotas a clientes
Clientes que interagem diretamente com os dados de negcio e objetos de servio de negcio causam um
aumento nas conversaes entre o cliente e o servidor. Este aumento pode degradar o desempenho da rede.
Todo o acesso aos objetos de negcio deve ser atravs do maior nvel de abstrao representado por uma
fachada. Uma vez que a fachada apresenta um mecanismo de acesso genrico para os componentes de
negcio, isto reduz o nmero de componentes de negcio que so expostos para o cliente. Desse modo, a
possibilidade de degradao do desempenho da aplicao reduzida devido o nmero limitado de interaes
entre os clientes e uma fachada, quando comparado com a interao direta do cliente com os componentes
de negcio individuais.
Cdigo de amostra
Implementando uma fachada
Considere uma aplicao de Servios Profissionais (PSA), onde o fluxo de trabalho relacionado com as
entity beans (como Project, Resource) encapsulado em ProjectResourceManagerSession, implementado
usando o padro Session Facade. O exemplo 8.15 mostra a interao com as entity beans Resource e
Project, bem como com outros componentes de negcios, como Value List Handlers (consulte "Value List
Handler" na pgina 354) e Transferncia de Objeto Assembler (ver "Transferncia de Objeto Assembler" na
pgina 340).
Exemplo 8.15 Implementando Session Facade - Session Bean
package corepatterns.apps.psa.ejb;
import java.util.*;
import java.rmi.RemoteException;
import javax.ejb.*;
import javax.naming.*;
import corepatterns.apps.psa.core.*;
import corepatterns.util.ServiceLocator;
import corepatterns.util.ServiceLocatorException;
// Note: all try/catch details not shown for brevity.
public class ProjectResourceManagerSession
implements SessionBean {
private SessionContext context;
// Remote references for the
// entity Beans encapsulated by this facade
private Resource resourceEntity = null;
private Project projectEntity = null;
...
// default create
public void ejbCreate()
throws CreateException {
}
// create method to create this facade and to
// establish connections to the required entity
// beans
// using primary key values
public void ejbCreate(
String resourceId, String projectId, ...)
throws CreateException, ResourceException {
try {
// locate and connect to entity beans
connectToEntities(resourceId, projectId, ...);
} catch(...) {
// Handle exceptions
}
}
// method to connect the session facade to its
// entity beans using the primary key values
private void connectToEntities (
String resourceId, String projectId)
throws ResourceException {
resourceEntity = getResourceEntity(resourceId);
projectEntity = getProjectEntity(projectId);
...
}
// method to reconnect the session facade to a
// different set of entity beans using primary key
// values
public resetEntities(String resourceId,
String projectId, ...)
throws PSAException {
connectToEntities(resourceId, projectId, ...);
}
// private method to get Home for Resource
private ResourceHome getResourceHome()
throws ServiceLocatorException {
return ServiceLocator.
getInstance().getHome(
"ResourceEntity", ResourceHome.class);
}
// private method to get Home for Project
private ProjectHome getProjectHome()
throws ServiceLocatorException {
return ServiceLocator.
getInstance().getHome(
"ProjectEntity", ProjectHome.class);
}
// private method to get Resource entity
private Resource getResourceEntity(
String resourceId) throws ResourceException {
try {
ResourceHome home = getResourceHome();
return (Resource)
home.findByPrimaryKey(resourceId);
} catch(...) {
// Handle exceptions
}
}
// private method to get Project entity
private Project getProjectEntity(String projectId)
throws ProjectException {
// similar to getResourceEntity
...
}
// Method to encapsulate workflow related
// to assigning a resource to a project.
// It deals with Project and Resource Entity beans
public void assignResourceToProject(int numHours)
throws PSAException {
try {
if ((projectEntity == null) ||
(resourceEntity == null)) {
// SessionFacade not connected to entities
throw new PSAException(...);
}
// Get Resource data
ResourceTO resourceTO =
resourceEntity.getResourceData();
// Get Project data
ProjectTO projectTO =
projectEntity.getProjectData();
// first add Resource to Project
projectEntity.addResource(resourceTO);
// Create a new Commitment for the Project
CommitmentTO commitment = new
CommitmentTO( ...);
// add the commitment to the Resource
projectEntity.addCommitment(commitment);
} catch(...) {
// Handle exceptions
}
}
// Similarly implement other business methods to
// facilitate various use cases/interactions
public void unassignResourceFromProject()
throws PSAException {
...
}
// Methods working with ResourceEntity
public ResourceTO getResourceData()
throws ResourceException {
...
}
Service Locator
The Session Facade is a coarse-grained object that allows encapsulation of the workflow by managing
business data and business service objects interactions. Business data objects can be entity beans or DAOs,
and the business service objects can be session beans and other objects that provide service. The Session
Facade can use the Service Locator pattern to reduce the code complexity and to exploit the benefits offered
by the Service Locator.
Business Delegate
The Session Facade is used by the Business Delegate when the client requests access to business services.
The Business Delegate proxies or adapts the client request to a Session Facade that provides the requested
service.
Broker [POSA1]
The Session Facade performs the role of a broker to decouple the entity beans from their clients.
http://www.oracle.com/technetwork/java/sessionfacade-141285.html