"Hei, Amigo! I dag skal jeg fortelle deg nøyaktig hva en « adapter » er. Jeg håper at etter å ha lært om dette emnet vil du ha en mye bedre forståelse av input/output-strømmer."

Adaptere - 1

Tenk deg at programmet ditt bruker to rammeverk skrevet av andre programmerere/selskaper. Begge rammeverkene er veldig gode og bruker OOP-prinsipper: abstraksjon, polymorfisme, innkapsling. Sammen dekker de nesten helt det programmet ditt trenger å gjøre. Du sitter igjen med en enkel oppgave. Du må overføre objekter opprettet av ett rammeverk til det andre rammeverket. Men begge rammene er helt forskjellige og «vet ikke om hverandre», dvs. at de ikke har noen klasser til felles. Du må på en eller annen måte konvertere objektene til det ene rammeverket til objektene til det andre.

Denne oppgaven kan løses vakkert ved å bruke « 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 gjenspeiler adapterdesignmønsteret.

Den grunnleggende ideen er at MyClass-klassen konverterer (tilpasser) det ene grensesnittet til det andre.

"Kan du gi meg et mer spesifikt eksempel?"

"OK. La oss si at hvert rammeverk har sitt eget unike "liste"-grensesnitt. De kan se omtrent slik ut:"

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 det første ( alfa ) rammeverket

AlphaList er et av grensesnittene som lar rammekoden samhandle med koden som bruker rammeverket.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager er en klasse i rammeverket. CreateList-metoden oppretter 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 det andre ( Beta ) rammeverket.

BetaList er et av grensesnittene som lar rammekoden samhandle med koden som bruker rammeverket.

BetaSaveManager er en klasse i rammeverket. SaveList- metodenlagrer 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»-klassen som konverterer fra AlphaList- grensesnittet til BetaList- grensesnittet

ListAdapter - klassen implementerer BetaList- grensesnittet fra det andre rammeverket.

Når noen kaller disse metodene, «sender» klassekoden kallene til listevariabelen , som er en AlphaList fra det første rammeverket.

Et AlphaList- objekt sendes til ListAdapter -konstruktøren

SetSize - metoden fungerer i henhold til følgende regler: hvis størrelsen på listen må økes, legg til tomme (null) elementer. Hvis størrelsen på listen må reduseres, slett elementer på slutten.

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

"Jeg likte det siste eksemplet ditt mest av alt. Veldig kortfattet og forståelig."