Skip to content

Структура работы адаптера

Адаптер объектов

Эта реализация использует агрегацию: объект адаптера «оборачивает» служебный объект, то есть содержит ссылку на этот объект. Такой подход работает во всех языках программирования.

  1. Клиент — это класс, который содержит существующую бизнес-логику программы.
  2. Клиентский интерфейс описывает протокол, через который клиент может работать с другими классами.
  3. Сервис — это какой-то полезный класс, обычно сторонний. Клиент не может использовать этот класс напрямую, так как интерфейс сервиса ему непонятен.
  4. Адаптер — это класс, который может одновременно работать и с клиентом, и с сервисом. Он реализует клиентский интерфейс и содержит ссылку на объект сервиса. Адаптер получает вызовы от клиента через методы клиентского интерфейса, а затем переводит их в вызовы методов обёрнутого объекта в правильном формате.
  5. Работая с адаптером через интерфейс, клиент не привязывается к конкретному классу адаптера. Благодаря этому ты можешь добавлять в программу новые виды адаптеров независимо от клиентского кода. Это может пригодиться, если интерфейс сервиса вдруг изменится, например после выхода новой версии сторонней библиотеки.

Адаптер классов

Эта реализация базируется на наследовании: адаптер наследует оба интерфейса одновременно. Такой подход возможен только в языках, поддерживающих множественное наследование, например в C++.

Адаптер классов не нуждается во вложенном объекте, так как он может одновременно наследовать и часть существующего класса, и часть сервиса.

Псевдокод

В этом шуточном примере адаптер преобразует один интерфейс в другой, позволяя совместить квадратные колышки и круглые отверстия.

Пример адаптации квадратных колышков к круглым отверстиям

Адаптер вычисляет наименьший радиус окружности, в которую можно вписать квадратный колышек, и представляет его как круглый колышек с этим радиусом.