JavaRush /Курси /Java Core /Адаптери

Адаптери

Java Core
Рівень 9 , Лекція 1
Відкрита

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

Адаптери - 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);
}
Приклад використання

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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ