Adapter

1 Sinopsis

Permite cambiar la interfase de un modulo de software, de tal manera que los clientes interactuan con la interfase sin tener que conocer la estructura del modulo adaptado.

2 Contexto

Se tiene una clase que proporciona metodos necesarios para realizar ciertas actividades. Se necesita integrarla con un nuevo modulo de software, el cual puede adoptar nuevos modulos si y solo si se declaran a implantar el servicio que necesita el nuevo modulo.

3 Solucion

El diagrama UML es el siguiente:

4 Consecuencias

5 Ejemplo

Se tiene una clase que con metodos predifinidos


public class LoQueTengo  {
    ....
}
See the complete code for LoQueTengo here.
 public void g() { System.out.println("Metodo g");}
 public void h() { System.out.println("Metodo h");}

Se necesita usar dentro de una clase que espera una interfase LoQueQuiero


public class LoQueUso  {
    ....
}
See the complete code for LoQueUso here.
  public void op(LoQueQuiero wiw) {
    wiw.f();
  }

La interfase LoQueQuiero define el siguiente contrato


public interface LoQueQuiero  {
    ....
}
See the complete code for LoQueQuiero here.
 public void f();

Con el fin de que la clase LoQueTengo sea utilizada por el modulo LoQueQuiero, se puede definir una nueva clase que se comprometa a implantar el contrato de la interfase LoQueQuiero y que por medio de delegacion utilice los metodos de la clase LoQueTengo. La clase se denomina Adaptado:


public class Adaptador implements LoQueQuiero  {
    ....
}
See the complete code for Adaptador here.
 private LoQueTengo delegado=new LoQueTengo();
 public void f(){
    delegado.g();
    delegado.h();
 }

La clase ClienteAdaptador combina las clases anteriores


public class ClienteAdaptador  {
    ....
}
See the complete code for ClienteAdaptador here.
public static void main(String [] args) {
 LoQueUso u = new LoQueUso();
 Adaptador a = new Adaptador();
 u.op(a);

}