Il Design Pattern Adapter

Design Pattern Adapter

Il Design Pattern Adapter permette di convertire l’interfaccia di una classe per permettere l’interoperabilità tra classi.
Consente in pratica di utilizzare funzioni o metodi di altri classi che però accettano parametri diversi o ritornano tipi diversi di dato.

Si può implementare in due modi:

  1. La classe adapter ha un attributo che è un riferimento alla classe che contiene il metodo che voglio utilizzare, (structural object)
  2. La classe adapter estende la classe che contiene il metodo che desidero riutilizzare, (structural class)

Il secondo metodo ha il vantaggio che permette l’override dei metodi della classe estesa, posso chiamare anche i metodi protected, di contro espongo anche tutti i metodi della classe estesa.

Nell'esempio seguente presento entrambi i sistemi per implementare il Design Pattern Adapter, nell'esempio abbiamo una funzione nell'adaptee che restituisce l'area tra due punti, mentre nell'adapter esponiamo una funzione che calcola l'area con la base e l'altezza, lo scopo della funziona Adapter è creare una interfaccia per poter utilizzare la funzione dell'Adaptee :

public interface Target {
   int AreaR(int base, int altezza);
}
**********************************************
public class Adaptee {

    int AreaP(Punto a, Punto b){
        return Math.abs(b.x - a.x) * Math.abs(b.y - a.y);
    }

}
**********************************************
public class AdapterObject implements Target{

    private Adaptee _adapter = new Adaptee();

    @Override
    public int AreaR(int a, int b) {
        Punto pa = new Punto(0,0);
        Punto pb = new Punto(a,b);
        return _adapter.AreaP(pa, pb);
    }
    
}
**********************************************
public class AdapterClass extends Adaptee implements Target{
    @Override
    public int AreaR(int a, int b) {
        Punto pa = new Punto();
        Punto pb = new Punto();
        pa.x = 0;
        pa.y = 0;
        pb.x = a;
        pb.y = b;
        return AreaP(pa, pb);
    }   
}
*********************************************
public class Punto {
    int x;
    int y;
    
    public Punto(){}
    
    public Punto(int ax, int ay){
        x = ax;
        y = ay;
    }
}
**********************************************
public class Client {
    
    public static void main(String[] args) {
        
        AdapterObject a = new AdapterObject();
        int s = a.AreaR(3, 5);
        System.out.println(s);
        
        AdapterClass b = new AdapterClass();
        int s2 = b.AreaR(3, 5);
        System.out.println(s2);
        
    }
}