"Bună ziua, Amigo! Astăzi vă voi spune ce este exact un « adaptor ». Sper că, după ce veți afla despre acest subiect, veți înțelege mult mai bine fluxurile de intrare/ieșire."

Adaptoare - 1

Imaginează-ți că programul tău folosește două cadre scrise de alți programatori/companii. Ambele cadre sunt foarte bune și folosesc principii OOP: abstractizare, polimorfism, încapsulare. Împreună, acestea acoperă aproape complet ceea ce trebuie să facă programul dvs. Ai rămas cu o sarcină simplă. Trebuie să transferați obiectele create de un cadru celuilalt. Dar ambele cadre sunt complet diferite și „nu știu unul despre celălalt”, adică nu au clase în comun. Trebuie să convertiți cumva obiectele unui cadru în obiecte ale celuilalt.

Această sarcină poate fi rezolvată frumos prin aplicarea tehnicii « adaptor » (model de design):

Cod Java Descriere
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
}
Aceasta reflectă modelul de design al adaptorului.

Ideea de bază este că clasa MyClass convertește (adaptă) o interfață la cealaltă.

— Îmi poți da un exemplu mai concret?

„OK. Să spunem că fiecare cadru are propria sa interfață unică de „listă”. Ar putea arăta cam așa:”

Cod Java Descriere
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);
}
Cod din primul cadru ( Alfa ) .

AlphaList este una dintre interfețele care permite codului cadru să interacționeze cu codul care folosește cadrul.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager este o clasă în cadru. Metoda sa createList creează unobiect 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
 }
}
Cod din al doilea cadru ( Beta ).

BetaList este una dintre interfețele care permite codului cadru să interacționeze cu codul care folosește cadrul.

BetaSaveManager este o clasă în cadru. Metoda sa saveList salvează unobiect 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);
   }
  }
 }
}
Clasa «Adaptor» care se convertește din interfața AlphaList în interfața BetaList

Clasa ListAdapter implementează interfața BetaList din al doilea cadru.

Când cineva apelează aceste metode, codul clasei „redirecționează” apelurile către variabila listă , care este o AlphaList din primul cadru.

Un obiect AlphaList este transmis constructorului ListAdapter

Metoda setSize funcționează după următoarele reguli: dacă dimensiunea listei trebuie mărită, adăugați articole goale (nule). Dacă dimensiunea listei trebuie redusă, ștergeți elementele la sfârșit.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Un exemplu despre cum ar putea fi folosit

"Cel mai mult mi-a plăcut ultimul tău exemplu. Foarte concis și de înțeles."