Patrón de diseño adapter en Java

patron adapter java

patron adapter java


Siguiendo con los patrones de diseño en Java, vamos a ver como podemos construir y hacer uso del Patrón Adapter, el cual se encuentra dentro de los patrones de diseño estructurales.

Este patrón, como su propio nombre indica va a funcionar como un adaptador entre dos objetos, por un lado recibirá información de un objeto y por otro lado lo transformará y creará las interfaces necesarias para ser consumido por otro objeto.

Cuándo usar el patrón Adapter

El uso del patrón Adapter es muy común de usar en sistemas legacy, cuando queremos hacer uso de lo antiguo para que sea procesado por otro servicio, por ejemplo, cuando tenemos un sistema que nos devuelve ficheros en formato XML y nuestro nuevo sistema necesita procesar esa información en formato JSON.

Para estos casos y evitar tener que tocar un código que ya existe y sabemos que funciona (si funciona bien mejor no tocar) podemos hacer esta pieza intermedia que nos permitirá a partir de un valor de entrada «adaptarlo» y devolver un valor de salida según nuestras necesidades.

Cómo aplicar el patrón Adapter

Lo primero a tener en cuenta a la hora de aplicar este patrón es que tenemos unas clases o aplicaciones que ya están funcionando. Y el objetivo es crear un «intermediario» entre diferentes clases o aplicaciones para comunicarlas entre sí.

Con nuestro «adaptador» vamos a crear una capa middle que se encargará de hacer de traductor entre dos sistemas, aplicaciones o clases. De esta manera podremos mantener nuestros antiguos códigos.

El patrón Adapter va a evitar tener que modificar códigos existentes o añadir complejidad a estos códigos. De esta manera con el patrón Adapter podremos tener un código más mantenible.

Patrón Adapter | Patrón de diseño adapter en Java
Patrón adapter

Ejemplo Patrón Adapter

A continuación vamos a crear un ejemplo en el que aplicaremos el patrón Adapter. Si quieres ver el código directamente puedes ir aquí. https://github.com/refactorizando-web/patterns

Tenemos un sistema legacy que todos los ficheros que exporta son en XML y tenemos una aplicación que procesa ficheros en JSON para realizar procesamiento de datos. Ninguna de las aplicaciones pueden ser cambiadas ya que son utilizadas por más aplicaciones por lo que debemos de añadir un adapter.

Vamos a describir los pasos a seguir para crear nuestro adapter:

Crear Interfaz Adapter

El primer paso para crear nuestro Adapter es crear una interfaz que sea el punto de entrada para transformar de un formato a otro.

interface  IDataAdapter {

  String convert(XMLToJSON xml) throws IOException;

}

Definir la clase de lógica de nuestro Adaptador

En este punto vamos a añadir la lógica necesaria para convertir de XML a JSON. Vamos a definir una clase XML que se encargará de convertir XML a JSON.

public class XMLToJSON {

  public XMLToJSON(String xml) {
    this.xml = xml;
  }


  private final String xml;
  public String convertToJSONFromXML() throws IOException {

    //lógica para convertir a JSON

    XmlMapper xmlMapper = new XmlMapper();
    JsonNode node = xmlMapper.readTree(xml.getBytes());
    ObjectMapper jsonMapper = new ObjectMapper();
    return jsonMapper.writeValueAsString(node);

  }
}

Implementar nuestra clase Adaptador

El paso final se´ria la creación de una clase que implementa la interfaz que hemos creado antes que se encargará de llamar invocar a la clase que contiene la lógica de conversión. Es decir, nuestra clase adapter hará una llamada a convertToJson().

public class XmlToJsonAdapter implements IDataAdapter {

  private final XMLToJSON xmlToJSON;

  public XmlToJsonAdapter(XMLToJSON xml){
    this.xmlToJSON = xml;
  }

  public String convert(XMLToJSON xml) throws IOException {
    return this.xmlToJSON.convertToJSONFromXML();
  }

}

Una vez finalizada nuestra clase XmlToJsonAdapter, podríamos invocarlo desde nuestra clase principal de la siguiente manera:

public class Application {

  public static String XML_STRING =
      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
          "<root>" +
          "<firstName>John</firstName>" +
          "<lastName>Snow</lastName>" +
          "<age>25</age>" +
          "<spouse/>" +
          "<address>" +
          "<street>237 Harrison Street</street>" +
          "<city>Brooklyn, NY</city>" +
          "<state>New York</state>" +
          "<postalCode>11238</postalCode>" +
          "</address>" +
          "<phoneNumbers>" +
          "<type>mobile</type>" +
          "<number>212 555-3346</number>" +
          "</phoneNumbers>" +
          "<phoneNumbers>" +
          "<type>fax</type>" +
          "<number>646 555-4567</number>" +
          "</phoneNumbers>" +
          "</root>";

  public static void main(String[] args) throws IOException {

    XMLToJSON xmlToJSON = new XMLToJSON(XML_STRING);

    IDataAdapter adapter = new XmlToJsonAdapter(xmlToJSON);
    String json = adapter.convert(xmlToJSON);

    System.out.println(json);
  }
}

Esta implementación nos va a permitir respetar principios como responsabilidad única y un código abierto y extensible, cpermitiendo que se puedan crear sin ningún problema más conversores.

Pros de Patrón Adapter

  • Uno de los pros más importante es que respeta y mantiene el principio de responsabilidad única.
  •  Principio Open/Closed. Como hemos comentado antes tendremos un código abierto para poder añadir más tipos de conversores.

Contras de Patrón de diseño Adapter

Vamos a aumentar la complejidad de nuestra arquitectura ya que hay que añadir nuevas piezas. Hay que tener en cuenta, que quizás sea más rápido hacer un cambio directamente en el anterior código, pero corremos el riesgo de tener que añadir más conversores en el futuro. La aproximación del Adapter nos facilitaría cualquier cambio que se realice en el futuro.

Conclusión

En esta entrada hemos visto como podemos realizar la implementación del Patrón de diseño adapter en Java para realizar conversiones. El patrón Adapter va a ser de gran utilidad para realizar conversiones entre diferentes sistemas de manera que no tengamos que alterar o modificar ningún código existente.

Si quieres echar un ojo al ejemplo completo lo puedes hacer aquí: https://github.com/refactorizando-web/patterns

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *