Buscar (Don't Edit)

miércoles, 2 de enero de 2013

Patrones de Diseño: el patrón Adapter

Vaya que si dude demasiado a la hora de hacer éste tutorial, y es que el principal problema no era encontrar un ejemplo, sino decidir sobre que patrón debía ser elegido como tema del post. Y es que el ejemplo que hoy les traigo (una agenda de contactos) y la problemática que presenta (clases incompatibles) pudiera ser abordado mediante dos patrones diferentes: Adapter y Decorator, y es que éste último, entre sus muchas virtudes, podría resolver el problema en cuestión. Cómo podrán darse cuenta, al final me he decidido por el patrón que hoy encabeza el título de éste post, y es que realmente fue mediante el adapter cómo lo resolví (ya que ésta aplicación fue parte de uno de mis últimos proyectos escolares) y el objetivo principal del adapter es solucionar el problema de incompatibilidad de clases, sin embargo Decorator merece un lugar en éste blog y no tardaré en hacerle honores. Mientras tanto, vamos con el tutorial.

El hecho de que el ejemplo a continuación sea una agenda de contactos, no significa que sea el único contexto sobre el cuál aplicar el patrón Adapter, es más, ningún patrón esta atado a algún contexto en específico, ya que los ejemplos aquí mostrados solo reflejan parte de los usos que yo personalmente he hecho en mis desarrollos.

El patrón Adapter
Como su propio nombre lo indica, éste patrón se encarga de adaptar clases de interfaz incompatible para que trabajen de manera conjunta. Un ejemplo claro es cuando tenemos que hacer uso de alguna librería, pero surge la necesidad de adaptarse a ella. Nuestras opciones inmediatas son: o nosotros nos adaptamos a ella, o ella a nosotros. Lo mejor en éstos casos es crear un objeto que adapte tanto lo nuestro a lo de ella, como lo de ella a nosotros.

Agenda de contactos utilizando el patrón Adapter
El proyecto es una aplicación que maneja contactos personales (nombre, teléfonos, correos, etc.), y fue desarrollada por un grupo reducido de desarrolladores. Para empezar tenemos una interfaz Contacto que implementarán todos los tipos diferentes de contactos que existan y que consta de lo siguiente:

Las clases que implementan ésta interfaz son Amigo y Familiar, les recuerdo que las clases serán de lo mas simple, con el fin de enfocarnos únicamente en la implementación del patrón:
El problema surgió cuando se le encargó a un nuevo integrante del equipo desarrollar una nueva clase para los contactos que fuera CompañerosTrabajo, dicha clase quedó de la siguiente manera:

Como se puede observar la clase es totalmente diferente al estándar de las demás clases desarrolladas. Para solucionar esto se creó una clase que adaptara la clase CompañerosTrabajo para que implemente la interfaz Contacto.
¡Listo! Ya tenemos nuestra clase CompañerosTrabajo adaptada y que implementa la interfaz Contacto. Si la llamamos desde nuestro código principal tendremos lo siguiente.
Si bien es cierto que era igual de simple modificar la clase CompañerosTrabajo para que se adaptara a la interfaz Contacto, deben considerar que es una clase pequeña y muy simple, en algún momento nos toparemos con clases demasiado extensas donde no será tan fácil la modificación (en el caso de algunas API's).

Saludos y hasta la próxima.

No hay comentarios.:

Publicar un comentario