Design Patterns J2EE - Value Object -------------------------------------- Sem dúvida este é o design pattern J2EE mais famoso que temos. Por ser o primeiro a ser apresentado, irei reforçar a importância da correta compreensão do modelo que estamos utilizando para a descrição de cada padrão. Detalhes sobre este modelo estão no email anterior, que pode ser encontrado em http://www.mail-archive.com/dicas-list@;soujava.org.br/. Vamos ao pattern:
Nome : Value Object Outros nomes: Detail Object, Data Transfer Object, Replicate Object Contexto: Aplicação cliente necessita trazer grande quantidade de informações de um serviço remoto. Problema: Buscar uma informação por vez tem um custo de rede e performance extremamente alto. Solução: Trazer todos os dados de uma só vez, em uma única requisição de rede, em um objeto chamado Value Object. Consequências: + Menos invocações remotas + Simplifica a interface remota e sua implementação - Se não tomar cuidado, os dados carregados por um VO podem tornar-se inválidos. Estratégias: Implementar um JavaBean com todos os atributos que devem ser transportados "numa única viagem". Exemplo: /** * Classe cliente de um session bean qualquer * @author alegomes */ class Cliente { void lerDadosRemotos() { Object ref = InitialContext.lookup("MeuSession"); MeuSessionBeanHome home = PortableRemoteObject.narrow(ref, MeuSessionBeanHome.class); MeuSessionBean bean = home.create(); /* Ao inves de fazermos isso, que envolve várias conexões de rede..... * atr1 = bean.getAtributo1(); * atr2 = bean.getAtributo2(); * atr3 = bean.getAtributo3(); * (....) */ /* ....fazemos isto, que trará o mesmo conjunto de informações * com apenas 1 chamada remota: */ atr = bean.getValueObject(); } } /** * Interface remota do session bean * @author alegomes */ public interface MeuSessionBean extends EJBObject { /* Não precisa mais desses métodos: * public String getAtributo1() throws RemoteException; * public String getAtributo2() throws RemoteException; * public String getAtributo3() throws RemoteException; * * Declara apenas um: */ public ValueObjectQualquer getValueObject() throws RemoteException; } /** * Implementação do ValueObject * @author alegomes */ public class ValueObjectQualquer implements Serializable { private String atributo1; private String atributo2; private String atributo3; (...) public void setAtributo1(String a) { atributo1 = a; } public String getAtributo1() { return atributo1; } (....) /* gets e sets para os outros atributos */ } Observações: Originalmente, o Value Object tinha entity beans como principal ponto de utilização, ou seja, ao invés de fazermos diversos gets e sets para obter e modificar todos os atributos do entity, poderíamos buscar ou submeter todas as informações com uma única chamada de rede, através do VO. Entretanto, a partir da especificação EJB 2.0, com a presença das interfaces locais, a "exigência" de um Value Object para cada entity bean acabou caindo no desuso, pois o overhead de rede foi naturalmente eliminado. Em contrapartida, a idéia do Value Object ainda permanece ativa sempre que se falar no transporte da muitas informações entre dois nós da sua arquitetura. Próximo design pattern J2EE: Business Delegate 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)