"¡Hola, amigo! Hoy te diré qué es exactamente un " adaptador ". Espero que después de aprender sobre este tema, comprendas mucho mejor los flujos de entrada/salida".

Adaptadores - 1

Imagine que su programa utiliza dos marcos escritos por otros programadores/empresas. Ambos marcos son muy buenos y utilizan los principios de OOP: abstracción, polimorfismo, encapsulación. Juntos, cubren casi por completo lo que su programa necesita hacer. Te queda una tarea simple. Debe pasar los objetos creados por un marco al otro marco. Pero ambos marcos son completamente diferentes y "no se conocen", es decir, no tienen clases en común. Debe convertir de alguna manera los objetos de un marco en objetos del otro.

Esta tarea se puede resolver maravillosamente aplicando la técnica del « adaptador » (patrón de diseño):

codigo Java Descripción
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
}
Esto refleja el patrón de diseño del adaptador.

La idea básica es que la clase MyClass convierte (adapta) una interfaz a la otra.

"¿Puedes darme un ejemplo más específico?"

"Está bien. Digamos que cada marco tiene su propia interfaz de "lista" única. Podrían verse así:"

codigo Java Descripción
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);
}
Código del primer marco ( alfa )

AlphaList es una de las interfaces que permite que el código del marco interactúe con el código que usa el marco.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager es una clase en el marco. Su método createList crea unobjeto 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
 }
}
Código del segundo marco ( Beta ).

BetaList es una de las interfaces que permite que el código del marco interactúe con el código que usa el marco.

BetaSaveManager es una clase en el marco. Su método saveList guarda unobjeto 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);
   }
  }
 }
}
Clase «Adapter» que convierte de la interfaz AlphaList a la interfaz BetaList

La clase ListAdapter implementa la interfaz BetaList del segundo marco.

Cuando alguien llama a estos métodos, el código de clase «reenvía» las llamadas a la variable de lista , que es una AlphaList del primer marco.

Un objeto AlphaList se pasa al constructor ListAdapter

El método setSize funciona de acuerdo con las siguientes reglas: si se debe aumentar el tamaño de la lista, agregue elementos vacíos (nulos). Si es necesario reducir el tamaño de la lista, elimine elementos al final.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Un ejemplo de cómo se podría usar

"Me gustó más tu último ejemplo. Muy conciso y comprensible".