Patrón Adapter con Swift

Vamos a repasar uno de los patrones de diseño más ámpliamente usados en desarrollo, estamos hablando del Patrón Adapter.

El patrón adapter se emplea cuando una o varias partes de nuestro sistema no tienen un API o interface compatible con el que trabajar de forma homogénea con ellas.

Adolfo

¿Y cómo se implementa en Swift?

La forma más común de implementar el patrón Adapter en Swift es mediante protocolos, y luego usando extensiones de dicho protocolo en las clases o estructuras que deben trabajar de forma homogénea.

Vamos con un ejemplo

Supongamos que tenemos un sistema grande y queremos mantener un registro de todas las operaciones que se realizan.

Con el paso del tiempo se han ido añadiendo diferentes tipos de Logs y actualmente el sistema puede escribir logs en archivos, base de datos y en un servidor web.

Para cada uno de estos loggers se ha desarrollado una clase que contiene toda la operatoria necesaria para trabajar con cada uno.

Pero claro, no es lo mismo escribir una entrada de log al final de un archivo que insertarlo en una tabla de una base de datos, no hablemos ya de un cliente para el servidor web de logs.

Así que para facilitar el uso de todos estos sistemas y unificar su funcionamiento decidimos usar el patrón Adapter.

Lo primero es identificar las clases que necesitamos adaptar, en este caso los tres sistema de logging que tenemos en la app. Luego vamos a definir un protocolo con las tareas que tenemos que ejecutar con ellos.

En este caso lo vamos a hacer extremadamente sencillo y sólo necesitamos escribir entradas de log. De esa manera nuestro protocolo queda de esta forma

Una vez definido el protocolo nos toca hacer que las clases de logging implementen este nuevo protocolo, así que vamos a hacer uso de la extensiones.

Y ahora ya podemos hacer uso de nuestro flamante patrón Adapter, por lo que no haremos referencia directa a las clases de los Loggers, sino que lo haremos a través del protocolo que hemos definido

Como se puede ver la variables logger es de tipo Logging y en la función donde los usamos nos limitamos a llamar a la función definida en el protocolo sin preocuparnos de si tenemos que abrir una conexión HTTP, crear un stack de Core Data o añadir al final de un fichero en el sistema de archivos.

Resumen

Normalmente la forma en la que debemos implementar el patrón Adapter es mediante estos pasos:

  1. Identificar las clases o estructuras que necesitan ser adaptadas
  2. Definir un protocolo que represente las tareas necesarias para llevar a cabo la tarea
  3. Implementar el protocolo, bien mediante wrappers o extensiones, en las clases que lo necesitan
  4. Quitar las referencias directas a las clases que acabamos de adaptar.