Структура работы адаптера
Адаптер объектов
Эта реализация использует агрегацию: объект адаптера «оборачивает» служебный объект, то есть содержит ссылку на этот объект. Такой подход работает во всех языках программирования.
- Клиент — это класс, который содержит существующую бизнес-логику программы.
- Клиентский интерфейс описывает протокол, через который клиент может работать с другими классами.
- Сервис — это какой-то полезный класс, обычно сторонний. Клиент не может использовать этот класс напрямую, так как интерфейс сервиса ему непонятен.
- Адаптер — это класс, который может одновременно работать и с клиентом, и с сервисом. Он реализует клиентский интерфейс и содержит ссылку на объект сервиса. Адаптер получает вызовы от клиента через методы клиентского интерфейса, а затем переводит их в вызовы методов обёрнутого объекта в правильном формате.
- Работая с адаптером через интерфейс, клиент не привязывается к конкретному классу адаптера. Благодаря этому ты можешь добавлять в программу новые виды адаптеров независимо от клиентского кода. Это может пригодиться, если интерфейс сервиса вдруг изменится, например после выхода новой версии сторонней библиотеки.
Адаптер классов
Эта реализация базируется на наследовании: адаптер наследует оба интерфейса одновременно. Такой подход возможен только в языках, поддерживающих множественное наследование, например в C++.
Адаптер классов не нуждается во вложенном объекте, так как он может одновременно наследовать и часть существующего класса, и часть сервиса.
Псевдокод
В этом шуточном примере адаптер преобразует один интерфейс в другой, позволяя совместить квадратные колышки и круглые отверстия.
Пример адаптации квадратных колышков к круглым отверстиям
Адаптер вычисляет наименьший радиус окружности, в которую можно вписать квадратный колышек, и представляет его как круглый колышек с этим радиусом.