2010-12-27 10 views
7

Así que hay Iterable y Iterator y List. ¿Qué usa si está tratando de proporcionar una interfaz a otro código Java, para encapsular la funcionalidad proporcionada por un servicio remoto que devuelve resultados en "páginas"?java: patrón de diseño para obtener resultados paginados

Como ejemplo, consideremos una base de datos o una página web (por ejemplo flickr API). Después de la primera recuperación de resultados, conoce el número total de resultados y los primeros N resultados, pero no conoce los resultados restantes hasta que recupera el resto.

Respuesta

0

En mi aplicación decidido implementar Iterator<ListPage>, donde la implementación del repetidor de next() es descargar la página siguiente de resultados, y ListPage tiene métodos que devuelven la Lista real y los metadatos como el # total de resultados, # por página, página # y # total de páginas:

public interface ListPage<T> { 
    public List<T> getList(); 
    public int getTotal(); 
    public int getPage(); 
    public int getPages(); 
    public int getPerPage(); 
} 
4

En su caso, teniendo en cuenta que cada elemento es caro para recuperar, probablemente tiene sentido tomar los resultados agregados y no repetir directamente para cada elemento en el nivel de eliminación invocación.

posible, un método que devuelve una lista como esta:

List<YourClass> getResults(int offset, int maxResults) 

donde compensado sería el índice del primer elemento que desea iniciar desde y maxResults es el número máximo de elementos que desea tener en la lista. Luego puede iterar en la lista para mostrarla en su página.

El API Java Persistence también sigue el mismo patrón, la interfaz de consulta proporciona 3 métodos que hacer lo anterior:

setFirstResult() 
setMaxResults() 
List getResultList() 

http://download.oracle.com/javaee/5/api/javax/persistence/Query.html

2

Me gustaría seguir cumpliendo con Iterator interfaz, y no introduciría nuevos métodos (como se sugirió anteriormente). En su lugar, usaría lazy loading en hasElements(), nextElement(), y sus buscadores de clase.