"Ciao, Amigo! Oggi ti dirò cos'è esattamente un « adattatore ». Spero che dopo aver appreso di questo argomento avrai una comprensione molto migliore dei flussi di input/output."

Adattatori - 1

Immagina che il tuo programma utilizzi due framework scritti da altri programmatori/aziende. Entrambi i framework sono molto buoni e utilizzano i principi OOP: astrazione, polimorfismo, incapsulamento. Insieme, coprono quasi completamente ciò che il tuo programma deve fare. Ti rimane un compito semplice. È necessario passare gli oggetti creati da un framework all'altro framework. Ma entrambi i framework sono completamente diversi e "non si conoscono", cioè non hanno classi in comune. Devi in ​​qualche modo convertire gli oggetti di un framework in oggetti dell'altro.

Questo compito può essere magnificamente risolto applicando la tecnica dell'" adattatore " (schema di progettazione):

codice java Descrizione
class MyClass implements Interface2
{
 private Interface1 object;
 MyClass(Interface1 object)
 {
  this.object = object;
 }
// This is where we put the Interface2 methods 
// that call Interface1 methods
}
Ciò riflette il modello di progettazione dell'adattatore.

L'idea di base è che la classe MyClass converte (adatta) un'interfaccia all'altra.

"Puoi farmi un esempio più specifico?"

"OK. Diciamo che ogni framework ha la sua unica interfaccia "lista". Potrebbero assomigliare a questo:"

codice java Descrizione
interface AlphaList
{
 void add(int value);
 void insert(int index, int value);
 int get(int index);
 void set(int index, int value);
 int count();
 void remove(int index);
}
Codice dal primo framework ( Alpha ) .

AlphaList è una delle interfacce che consente al codice del framework di interagire con il codice che utilizza il framework.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager è una classe nel framework. Il suo metodo createList crea unoggetto AlphaList
interface BetaList
{
 int getValue(int index);
 void setValue(int index, int value);
 int getSize();
 void setSize(int newSize);
}
class BetaSaveManager
{
 public static void saveList(BetaList list)
 {
  //some code to save a BetaList object
  //to a file on disk
 }
}
Codice dal secondo framework ( Beta ).

BetaList è una delle interfacce che consente al codice del framework di interagire con il codice che utilizza il framework.

BetaSaveManager è una classe nel framework. Il suo metodo saveList salva unoggetto BetaList

class ListAdapter implements BetaList
{
 private AlphaList list;
 ListAdapter(AlphaList list)
 {
  this.list = list;
 }

 int getValue(int index)
 {
  return this.list.get(index);
 }

 void setValue(int index, int value)
 {
  this.list.set(index, value);
 }

 int getSize()
 {
  return this.list.count();
 }

 void setSize(int newSize)
 {
  if (newSize > this.list.count()
  {
   while (this.list.count() < newSize)
  {
   this.list.add(null);
  }
 }
 else if (newSize < this.list.count() {
   while (this.list.count() > newSize)
   {
    list.remove(list.count() - 1);
   }
  }
 }
}
Classe « Adapter» che converte dall'interfaccia AlphaList all'interfaccia BetaList

La classe ListAdapter implementa l' interfaccia BetaList dal secondo framework.

Quando qualcuno chiama questi metodi, il codice della classe «inoltra» le chiamate alla variabile list , che è una AlphaList del primo framework.

Un oggetto AlphaList viene passato al costruttore ListAdapter

Il metodo setSize opera secondo le seguenti regole: se la dimensione della lista deve essere aumentata, aggiungere elementi vuoti (nulli). Se la dimensione dell'elenco deve essere ridotta, eliminare gli elementi alla fine.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Un esempio di come potrebbe essere utilizzato

"Mi è piaciuto soprattutto il tuo ultimo esempio. Molto conciso e comprensibile."