Design Patterns J2EE - Value List Handler
----------------------------------------

Nome
--------------
Value List Handler

Outros nomes
--------------
Page By Page Iterator

Contexto
--------------
Clientes frequentemente precisam recuperar grande massa de informações para
formatação de relatórios na camada de apresentação.

Problema
--------------
- O alto custo do uso de métodos finders em entity beans não justifica
sua utilização para a recuperação para leitura de grande quantidade de informações.
- Para o cliente, é muito difícil absorver toda a massa de dados recuperados
de uma só vez, fazendo necessária a utilização de algum mecanismo de paginação do resultado da consulta.

Solução
--------------
Implementar um mecanismo para a recuperação de informações que não utilize
entity beans e que mantenha um cache do resultado para que os dados possam
ser fornecidos ao cliente de acordo com sua demanda.

Consequências
--------------
+ Melhora de performance: . o uso de entity beans para recuperar N registros envolve N+1 consultas SQL (1 para o findByAlgumaCoisa e outras N para popular cada bean que for encontrado). O uso de um mecanismo direto pode reduzir esta quantidade a apenas 1 query, independente da quantidade de registros encontrados.
. A possiblidade de implementação de um cache evita a necessidade de realização de uma nova query a cada transição entre páginas.


Estratégias
--------------
Criar um session bean statefull que implemente uma interface Iterator e, com o auxílio de DAOs (próximo pattern), acesse a camada de persistência, recupere as informações desejadas e mantenha estas informações em cache
para fornecer ao cliente segundo sua demanda.

/**
* Interface com serviços para a navegação no resultado
* @author alegomes
*/
public interface ValueListIterator
{
/**
* Navega para a proxima pagina
*/ public Collection next(int qtd);

/**
* Navega para a pagina anterior
*/ public Collection previous(int qtd);

/**
* Recupera o elemento corrente, que e a referencia para a * transicao entre paginas
*/ public ValueObject getCurrent();

/**
* Reinicializa o elemento corrente para o primeiro elemento da lista
*/ public void reset();

/**
* Retorna a quantidade de elementos disponiveis
*/ public int size();
}

/**
* VaueListHandle: Statefull session bean que implementa a interface * ValueListIterator
* @author alegomes
*/
class ValueListHandler implements ValueListIterator, SessionBean
{
private Vector cache;
//Indice para o elemento corrente. Ele é a referencia para a //transicao entre paginas. private int idxCurr;
//Indice para o ultimo elemento disponivel
private int idxLast;

public void ejbCreate()
{
cache = new Vector();
//Nao vem ao caso por enquanto, mas o proximo passo aqui
//seria a recuperacao das informacoes e o respectivo armazenamento
//no cache.
//Logo, teriamos uma serie de cache.add(elemento);
cache.trimToSize() idxCurr = 0; idxLast = cache.size();
}

//Outros metodos ejb*

//Inicio da implementacao da interface ValueListIterator

public Collection next(int qtd)
{
Vector page = new Vector();
while ((idxCurr < idxLast) && (qtd > 0))
{
page.add(cache.elementAt(idxCurr));
idxCurr++;
qtd--;
}

page.trimToSize();
return page;
}

public Collection previous(int qtd)
{
Vector page = new Vector();
while (idxCurr > 0 && qtd > 0)
{
idxCurr--;
page.add(cache.elementAt(idxCurr));
qtd--;
}
}

public ValueObject getCurrent()
{
return (ValueObject)cache.elementAt(idxCurr);
}

public void reset()
{
idxCurr = 0;
}

public int size()
{
return idxLast;
} }


Próximo design pattern J2EE: Data Access Object

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:[EMAIL PROTECTED]
- Para cancelar sua assinatura: mailto:[EMAIL PROTECTED]
- 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)


Responder a