— Привіт, Аміго! Сьогодні я розповім тобі, що таке «адаптер». Сподіваюся, що після його вивчення ти почнеш розуміти потоки введення-виведення набагато краще.

Адаптери - 1

Уяви, що у твоїй програмі ти використовуєш два фреймворки, написані іншими програмістами/компаніями. Обидва фреймворки дуже хороші і використовують принципи ООП: абстракцію, поліморфізм, інкапсуляцію. Вони разом практично повністю охоплюють завдання твоєї програми. За тобою залишилося просте завдання — об'єкти, які створює один фреймворк, потрібно передати в другий. Але обидва фреймворки абсолютно різні і «не знають один про одного» — тобто. немає загальних класів. Тобі потрібно якось перетворювати об'єкти одного фреймворку на об'єкти іншого.

Цю задачу можна вирішити, застосувавши підхід (патерн проектування) «адаптер»:

Код на Java Опис
class MyClass implements Interface2< /span>
{
 private Interface1 object;
 MyClass(Interface1 object)
 {
  this.object = object;
 }
 // Тут розташовуються методи Interface2,
 // які викликають методи Interface1
}
Це схематичний опис «патерну проектування адаптер».

Сутність його в тому, що клас MyClass є перетворювачем (адаптером) одного інтерфейсу до іншого.

— А чи можна конкретніший приклад?

— Ок. Припустимо, що кожен фреймворк має свій унікальний інтерфейс «список», ось як це може виглядати:

Код на Java Опис
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);
}
Код з першого (Alpha) фреймворку.

AlphaList – це один з інтерфейсів для взаємодії коду фреймворку та коду, який буде використовувати цей фреймворк.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //якийсь код створення об'єкта
 }
}
AlphaListManager – клас фреймворку , метод якого createList створює об'єкт типу 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)
 {
  //якийсь код збереження об'єкта
  //типу BetaList у файл на диску
 }
}
Код із другого (Beta) фреймворку.

BetaList – це один з інтерфейсів для взаємодії коду фреймворку та коду, який буде використовувати цей фреймворк.

BetaSaveManager – клас фреймворку, метод якого saveList зберігає на диск об'єкт типу 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);
   }
  }
 }
}
Клас "адаптер" (тобто перехідник) від інтерфейсу AlphaList до інтерфейсу BetaList

Клас ListAdapter реалізує інтерфейс BetaList з другого фреймворку.

Коли хтось викликає ці методи, код класу перевикликає методи змінної list, яка має тип AlphaList з першого фреймворку.

Об'єкт типу AlphaList передається в конструктор ListAdapter у момент створення

Метод setSize працює за принципом: якщо потрібно збільшити розмір списку – додамо туди порожніх (null) елементів. Якщо потрібно зменшити – видалимо кілька останніх.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha) ;
 BetaSaveManager.saveList(listBeta);
}
Приклад використання

— Найбільше сподобався приклад використання. Дуже компактно та зрозуміло.