"Szervusz, Amigo! Ma elmesélem, hogy pontosan mi is az " adapter ". Remélem, hogy miután megismerted ezt a témát, sokkal jobban megérted a bemeneti/kimeneti adatfolyamokat."

Adapterek - 1

Képzeld el, hogy a programod két keretrendszert használ, amelyeket más programozók/cégek írtak. Mindkét keretrendszer nagyon jó, és OOP elveket használ: absztrakció, polimorfizmus, beágyazás. Együtt szinte teljesen lefedik azt, amit a programnak tennie kell. Egy egyszerű feladat vár rád. Az egyik keretrendszer által létrehozott objektumokat át kell adnia a másik keretrendszernek. De a két keretrendszer teljesen más és "nem tudnak egymásról", azaz nincs közös osztályuk. Valahogy át kell alakítani az egyik keretrendszer objektumait a másik objektumaivá.

Ezt a feladatot szépen meg lehet oldani az „ adapter ” technika (tervezési minta) alkalmazásával :

Java kód Leírás
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
}
Ez tükrözi az adapter tervezési mintáját.

Az alapötlet az, hogy a MyClass osztály egyik interfészt a másikra konvertálja (adaptálja).

– Mondana egy konkrétabb példát?

"OK. Tegyük fel, hogy minden keretrendszernek megvan a saját egyedi "lista" felülete. Valahogy így nézhetnek ki:

Java kód Leírás
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);
}
Kód az első ( Alpha ) keretrendszerből

Az AlphaList az egyik olyan interfész, amely lehetővé teszi, hogy a keretkód kölcsönhatásba lépjen a keretrendszert használó kóddal.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager Az AlphaListManager egy osztály a keretrendszerben. A createList metódusa létrehoz egy AlphaList objektumot
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
 }
}
Kód a második ( Béta ) keretrendszerből.

A BetaList az egyik interfész, amely lehetővé teszi, hogy a keretkód kölcsönhatásba lépjen a keretrendszert használó kóddal.

A BetaSaveManager egy osztály a keretrendszerben. A saveList metódusa BetaList objektumotmentel

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» osztály, amely az AlphaList felületről a BetaList felületre konvertál

A ListAdapter osztály a BetaList felületet valósítja meg a második keretrendszerből.

Amikor valaki meghívja ezeket a metódusokat, az osztálykód «továbbküldi» a hívásokat a listaváltozóhoz , amely az első keretrendszerből származó AlphaList .

Egy AlphaList objektum átadásra kerül a ListAdapter konstruktornak

A setSize metódus a következő szabályok szerint működik: ha növelni kell a lista méretét, adjunk hozzá üres (null) elemeket. Ha a lista méretét csökkenteni kell, törölje a végén lévő elemeket.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Példa arra, hogyan lehet használni

"Az utolsó példád tetszett a legjobban. Nagyon tömör és érthető."