"Hej, Amigo! I dag vil jeg fortælle dig, hvad en " adapter " præcis er. Jeg håber, at efter at have lært om dette emne, vil du have en meget bedre forståelse af input/output-streams."

Adaptere - 1

Forestil dig, at dit program bruger to rammer skrevet af andre programmører/virksomheder. Begge rammer er meget gode og bruger OOP principper: abstraktion, polymorfi, indkapsling. Tilsammen dækker de næsten fuldstændigt, hvad dit program skal gøre. Du står tilbage med en simpel opgave. Du skal overføre objekter, der er oprettet af den ene ramme, til den anden ramme. Men begge rammer er helt forskellige og "ved ikke om hinanden", dvs. de har ingen klasser til fælles. Du skal på en eller anden måde konvertere objekterne i den ene ramme til objekterne i den anden.

Denne opgave kan smukt løses ved at anvende « adapter »-teknikken (designmønster):

Java kode Beskrivelse
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
}
Dette afspejler adapterens designmønster.

Den grundlæggende idé er, at MyClass-klassen konverterer (tilpasser) den ene grænseflade til den anden.

"Kan du give mig et mere specifikt eksempel?"

"OK. Lad os sige, at hver ramme har sin egen unikke "liste"-grænseflade. De kan se nogenlunde sådan ud:"

Java kode Beskrivelse
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);
}
Kode fra den første ( Alpha ) ramme

AlphaList er en af ​​de grænseflader, der gør det muligt for rammekoden at interagere med den kode, der bruger rammen.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager er en klasse i rammen. Dens createList-metode opretter et AlphaList- objekt
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
 }
}
Kode fra den anden ( Beta ) ramme.

BetaList er en af ​​de grænseflader, der gør det muligt for rammekoden at interagere med den kode, der bruger rammen.

BetaSaveManager er en klasse i rammen. Dens saveList- metode gemmer et BetaList- objekt

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);
   }
  }
 }
}
«Adapter»-klasse, der konverterer fra AlphaList- grænsefladen til BetaList- grænsefladen

ListAdapter - klassen implementerer BetaList- grænsefladen fra den anden framework.

Når nogen kalder disse metoder, «sender» klassekoden kaldene til listevariablen , som er en AlphaList fra den første ramme.

Et AlphaList- objekt sendes til ListAdapter -konstruktøren

SetSize - metoden fungerer i henhold til følgende regler: hvis størrelsen på listen skal øges, skal du tilføje tomme (nul) elementer. Hvis størrelsen på listen skal reduceres, skal du slette elementer til sidst.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Et eksempel på hvordan det kan bruges

"Jeg kunne mest af alt lide dit sidste eksempel. Meget kortfattet og forståeligt."