jueves, 10 de junio de 2010

Patrones de diseño: Adapter

Este patrón convierte la interfaz de una clase en otra distinta que es la que esperan los clientes y permite que cooperen clases que de otra manera no podrían por tener interfaces incompatibles.

Se encarga de proporcionar a una clase cliente el interfaz que necesita para trabajar utilizando en su implementación una clase o clases que no cumplen con dicho interfaz.

La mejor forma de ver este patrón es a través de un ejemplo. Supongamos que tenemos una clase Cliente que realiza cálculos matemáticos complejos cuya realización se delegan en otra clase. Vamos a suponer a modo de ejemplo que estos cálculos complejos pueden ser una suma o una resta. La interfaz requerida por esta clase cliente para sus cálculos se define en la interfaz Calculadora:
package com.roldan.adapter;

public interface Calculadora {
public int suma(int operador1, int operador2);
public int resta(int operador1, int operador2);
}

Para la ejecución de estos complejos cálculos se dispone de la clase Procesador que los implementa:
package com.roldan.adapter;

public class Procesador {
public static final int SUMA = 1;
public static final int RESTA = 2;

public static int realizarOperacion(
int operador1,
int operador2,
int operacion) {
int resultado = 0;

switch(operacion) {
case SUMA:
resultado = operador1 + operador2;
break;
case RESTA:
resultado = operador1 - operador2;
break;
}

return resultado;
}
}

En este caso, a pesar de que la clase Procesador realiza las operaciones que necesita la clase Cliente, no implementa la interfaz que ésta necesita para poder usarla. Sin embargo, se puede crear una clase Adaptador que adapte la clase Procesador a la interfaz Calculadora:
package com.roldan.adapter;

public class Adaptador implements Calculadora {
public int suma(
int operador1,
int operador2) {
return Procesador.realizarOperacion(
operador1,
operador2,
Procesador.SUMA);
}

public int resta(
int operador1,
int operador2) {
return Procesador.realizarOperacion(
operador1,
operador2,
Procesador.RESTA);
}
}

De esta forma, la clase Cliente puede usar los cálculos realizados en la clse Procesador a través de la clase Adaptador, que la adecúa a la interfaz Calculadora que necesita la clase Cliente.

El siguiente diagrama UML refleja las relaciones entre dichas clases:

Adapter pattern en Wikipedia
Patrón Adaptador en Wikipedia
Design Patterns Uncovered: The Adapter Pattern en DZone
Adapter Pattern en OODesign.com
Otros patrones de diseño

4 comentarios:

  1. realizarOperacion() es un método estático por lo que debería ir precedido del modificador static.

    :)

    ResponderEliminar
  2. Corregido. ;-)

    Gracias, Antonio.

    ResponderEliminar
  3. Gracias che!! busque en este tema en varias paginas para entenderlo bien y esta es la que mejor está explicada. Te pasaste y te agradezco. El blog esta muy bueno :D

    ResponderEliminar