"Hallo, Amigo! Vandaag zal ik je vertellen wat een « adapter » precies is. Ik hoop dat je na het leren over dit onderwerp een veel beter begrip zult hebben van input/output-stromen."

Adapters - 1

Stel je voor dat je programma twee frameworks gebruikt die zijn geschreven door andere programmeurs/bedrijven. Beide frameworks zijn erg goed en gebruiken OOP-principes: abstractie, polymorfisme, inkapseling. Samen dekken ze bijna volledig af wat uw programma moet doen. Je blijft achter met een eenvoudige taak. U moet objecten die door het ene raamwerk zijn gemaakt, doorgeven aan het andere raamwerk. Maar beide frameworks zijn totaal verschillend en "weten niet van elkaar", dwz ze hebben geen gemeenschappelijke klassen. Je moet op de een of andere manier de objecten van het ene raamwerk omzetten in objecten van het andere.

Deze taak kan prachtig worden opgelost door de « adapter » techniek (ontwerppatroon) toe te passen:

Java-code Beschrijving
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
}
Dit weerspiegelt het ontwerppatroon van de adapter.

Het basisidee is dat de klasse MyClass de ene interface naar de andere converteert (aanpast).

"Kun je me een specifieker voorbeeld geven?"

"OK. Laten we zeggen dat elk raamwerk zijn eigen unieke "lijst"-interface heeft. Ze kunnen er ongeveer zo uitzien:"

Java-code Beschrijving
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);
}
Code uit het eerste ( Alpha ) framework

AlphaList is een van de interfaces waarmee de raamwerkcode kan communiceren met de code die het raamwerk gebruikt.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager is een klasse in het framework. De methode createList maakt eenobject 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
 }
}
Code uit het tweede ( Beta ) framework.

BetaList is een van de interfaces waarmee de raamwerkcode kan communiceren met de code die het raamwerk gebruikt.

BetaSaveManager is een klasse in het framework. De saveList- methode slaat een BetaList- object

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 die converteert van de AlphaList- interface naar de BetaList- interface

De klasse ListAdapter implementeert de BetaList- interface van het tweede framework.

Wanneer iemand deze methoden aanroept, "stuurt" de klassencode de oproepen door naar de lijstvariabele , een AlphaList uit het eerste framework.

Een AlphaList- object wordt doorgegeven aan de ListAdapter- constructor

De methode setSize werkt volgens de volgende regels: als de grootte van de lijst moet worden vergroot, voeg dan lege (null) items toe. Als de grootte van de lijst moet worden verkleind, verwijdert u items aan het einde.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Een voorbeeld van hoe het gebruikt kan worden

"Ik vond je laatste voorbeeld het leukst. Heel beknopt en begrijpelijk."