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

Адаптеры

Java Core
9 уровень , 1 лекция
Открыта

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

Адаптеры - 1

Представь, что в твоей программе ты используешь два фреймворка, написанные другими программистами/компаниями. Оба фреймворка очень хорошие и используют принципы ООП: абстракцию, полиморфизм, инкапсуляцию. Они вместе практически полностью покрывают задачи твоей программы. За тобой осталось простая задача — объекты, которые создает один фреймворк нужно передать во второй. Но оба фреймворка совершенно разные и «не знают друг о друге» — т.е. не имеют общих классов. Тебе нужно как-то преобразовывать объекты одного фреймворка в объекты другого.

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

Код на Java Описание
class MyClass implements Interface2 {
    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);
}
Пример использования

— Больше всего понравился пример использования. Очень компактно и понятно.

Комментарии (400)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
8 сентября 2025
like
kekich119 Уровень 30
25 июня 2025
Ты не один — эта тема может запутать, особенно если ты ещё только начинаешь работать с интерфейсами и паттернами. Давай объясню простыми словами и пошагово, что происходит. ⸻ 🔌 Представь себе адаптер в жизни У тебя есть розетка европейского типа (круглая), а зарядка от устройства — американская (плоская). Они не совместимы. Но ты покупаешь адаптер, вставляешь туда американскую вилку, а сам адаптер вставляешь в европейскую розетку. Всё работает! ⸻ 🧠 То же самое в программировании У тебя есть два интерфейса: • AlphaList — один список (например, написан кем-то другим) • BetaList — другой список (другая библиотека) Они разные, несовместимы. Один не знает про другого. Но тебе нужно передать AlphaList → туда, где ждут BetaList. Как быть? Создаём адаптер — специальный класс, который: • принимает AlphaList • реализует BetaList • внутри вызывает методы AlphaList ⸻ 📦 Пример проще (псевдокод) Допустим: interface AlphaList { void add(int value); int get(int index); int count(); } interface BetaList { int getValue(int index); int getSize(); } Они вроде бы делают похожее — но по-разному называются. И ты не можешь просто так использовать AlphaList там, где ждут BetaList. ⸻ 🛠 Решение — написать адаптер class ListAdapter implements BetaList { private AlphaList list; public ListAdapter(AlphaList list) { this.list = list; } public int getValue(int index) { return list.get(index); // используем AlphaList } public int getSize() { return list.count(); // тоже AlphaList } } То есть ты переводишь Beta-методы → в Alpha-методы. И теперь любой код, который ждёт BetaList, может работать, а внутри будет использоваться AlphaList. ⸻ 🧪 Где это используется Ты получил AlphaList из одного фреймворка: AlphaList listAlpha = AlphaListManager.createList(); Но ты хочешь сохранить его через другой фреймворк, который работает только с BetaList: BetaSaveManager.saveList(...);
The Sanya Уровень 29
21 июня 2025
🟦 AlphaList (старый интерфейс) Интерфейс, который уже реализован и используется где-то в системе. Позволяет работать с элементами списка (добавление, удаление, изменение). 🟦 BetaList (новый интерфейс) Интерфейс, который ожидает BetaSaveManager. У него другой набор методов: getValue, setValue, setSize, и т.д. 🟦 ListAdapter Реализует BetaList Содержит внутри объект AlphaList Переопределяет методы BetaList, преобразуя их в вызовы соответствующих методов AlphaList getValue() → get() setSize() → вызывает add() или remove() из AlphaList для корректировки размера 🟦 AlphaListManager Создаёт список типа AlphaList 🟦 BetaSaveManager Ожидает объект BetaList и сохраняет его в файл. Благодаря адаптеру, мы можем передавать AlphaList, обёрнутый в ListAdapter.
The Sanya Уровень 29
21 июня 2025
┌────────────────┐ │ AlphaList │◄────────────┐ └────────────────┘ │ ▲ │ │ │ uses ┌────────────────┐ │ │ AlphaListImpl │ │ └────────────────┘ │ │ ┌────────────────┐ ▼ │ ListAdapter │────────► AlphaList (объект) │ implements │ │ BetaList │ └────────────────┘ ▲ │ ┌────────────────┐ │ BetaList │ └────────────────┘ ┌────────────────────┐ │ BetaSaveManager │ └────────────────────┘ ▲ │ saveList(BetaList list) ┌────────────────────┐ │ AlphaListManager │ └────────────────────┘ ▼ createList() → AlphaList
Victor Уровень 36
2 июня 2025
За лекцию 2, за комментарии 5+
GermanPotarev Уровень 32 Expert
12 марта 2025
Чувствую себя на ЧГК: какой красивый вопрос, когда знаешь ответ ))) Посмотрел видео из комментариев, почитал, порешил и только тогда понял примеры из лекции )))
Anand Уровень 32
7 января 2025
грустно все(
ВК Уровень 36
11 декабря 2024
Спросил у гугла, чем адаптер отличается от декоратора: Отличие декоратора от адаптера в том, что адаптер имеет внешний интерфейс, отличный от интерфейса оборачиваемого объекта, и используется именно для стыковки разных интерфейсов. Декоратор же имеет точно такой же интерфейс, и используется для добавления функциональности.
{Java_Shark} Уровень 36
5 декабря 2024
++
Денис Кокшаров Уровень 32
17 марта 2025
++Java_Shark
Плотва Из Ривии Уровень 33
26 июня 2024
https://www.youtube.com/watch?v=6xDBbYe11HQ после просмотра стало все понятно
Антон Карпов Уровень 5
15 октября 2024
спасибо! шикарное видео)