"Olá, amigo! Hoje eu vou te dizer o que exatamente é um « adaptador ». Espero que depois de aprender sobre este tópico você tenha um entendimento muito melhor sobre fluxos de entrada/saída."

Adaptadores - 1

Imagine que seu programa usa dois frameworks escritos por outros programadores/empresas. Ambos os frameworks são muito bons e usam princípios OOP: abstração, polimorfismo, encapsulamento. Juntos, eles cobrem quase completamente o que seu programa precisa fazer. Você fica com uma tarefa simples. Você precisa passar objetos criados por um framework para o outro framework. Mas ambos os frameworks são completamente diferentes e "não se conhecem", ou seja, não possuem nenhuma classe em comum. Você precisa de alguma forma converter os objetos de um framework em objetos do outro.

Essa tarefa pode ser lindamente resolvida aplicando a técnica do « adaptador » (padrão de design):

código Java Descrição
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
}
Isso reflete o padrão de design do adaptador.

A ideia básica é que a classe MyClass converte (adapta) uma interface na outra.

"Você pode me dar um exemplo mais específico?"

"OK. Digamos que cada estrutura tenha sua própria interface de "lista" exclusiva. Eles podem se parecer com isto:"

código Java Descrição
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 da primeira estrutura ( Alpha )

AlphaList é uma das interfaces que permite que o código do framework interaja com o código que usa o framework.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager é uma classe na estrutura. Seu método createList cria umobjeto 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 da segunda estrutura ( Beta ).

BetaList é uma das interfaces que permite que o código do framework interaja com o código que usa o framework.

BetaSaveManager é uma classe na estrutura. Seu método saveList salva umobjeto 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);
   }
  }
 }
}
Classe «Adapter» que converte da interface AlphaList para a interface BetaList

A classe ListAdapter implementa a interface BetaList da segunda estrutura.

Quando alguém chama esses métodos, o código da classe «encaminha» as chamadas para a variável de lista , que é uma AlphaList do primeiro framework.

Um objeto AlphaList é passado para o construtor ListAdapter

O método setSize opera de acordo com as seguintes regras: se for necessário aumentar o tamanho da lista, adicione itens vazios (nulos). Se o tamanho da lista precisar ser reduzido, exclua os itens no final.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Um exemplo de como pode ser usado

"Gostei mais do seu último exemplo. Muito conciso e compreensível."