25 de abril de 2009

Wrapper con patrón Decorator

Actualmente me encuentro en el diseño e implementación de una interfase de acceso a servicios (más que nada, llamadas a web services).

Lo que inicialmente se hizo fue lo siguiente:

Interface
public interface DataAccessService
{
public List getCreditCards() throw ServiceException;
}

Implementadora
public class DataAccessServiceImpl implements DataAccessService
{
public List getCreditCards() throw ServiceException
{
...
...
return creditCardsList;
}
}


Hasta aqui todo bien, en la implementadora creamos los inputs necesarios y llamamos al proxy generado para la comunicación con el servicio web.

Ahora, pongamonos en el caso de que el servicio nos devuelve todas las tarjetas (Bloqueadas y No Bloqueadas) y uno de los requerimientos es solo obtener las tarjetas No Bloqueadas.

A continuación la solución planteada:

Interface
public interface DataAccessService
{
public List getCreditCards() throw ServiceException;
}

Implementadora encargada de la llamada al servicio web
public class DataAccessServiceImpl implements DataAccessService
{
public List getCreditCards() throw ServiceException
{
...
...
return creditCardsList;
}
}


Implentadora encargada del filtro
public class FilterDataService implements DataAccessService
{
private DataAccessService dataAccessService;

public FilterDataService(DataAccessService dataAccessService)
{
this.dataAccessService = dataAccessService;
}
public List getCreditCards() throw ServiceException
{
List creditCardsList = dataAccessService.getCreditCards();

// Do something with the result, extra functionality
...
...
return filteredCardsList;
}
}


Como hemos visto, creando la clase FilterDataService, podemos agregar funcionalidad extra luego de llamar a la clase DataAccessServiceImpl, pudiendo aqui realizar el filtro que requerimos. En nuestro ServiceFactory colocariamos algo como esto para obtener la implementacion necesaria:

private static DataAccessService dataAccessService = new FilterDataService(new DataAccessServiceImpl());

public static DataAccessService getDataAccessService()
{
return dataAccessService;
}

Bueno, espero les sirva esto en algún momento en algún proyecto de desarrollo. Yo lo estoy utilizando ahora.

Nos vemos!

No hay comentarios:

Publicar un comentario