Skip to content

Применимость и шаги реализации Adapter

Применимость паттерна

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

Этот паттерн позволяет создать объект-прокладку, который будет превращать вызовы приложения в формат, понятный стороннему классу.

Адаптер применим и в том случае, когда тебе нужно использовать несколько существующих подклассов, в которых не хватает какой-то общей функциональности, причём расширить суперкласс ты не можешь.

Можно было бы создать ещё один уровень подклассо в и добавить в них недостающую функциональность. Но при этом пришлось бы продублировать один и тот же код в обеих ветках подклассов.

Более элегантным решением было бы поместить недостающую функциональность в адаптер и приспособить его к работе с суперклассом. Такой адаптер сможет работать со всеми подклассами иерархии. Это решение будет сильно напоминать паттерн декоратор.

Шаги реализации паттерна

  1. Убедись, что у тебя есть два класса с несовместимыми интерфейсами:
    • полезный сервис — служебный класс, который ты не можешь изменять (он либо сторонний, либо от него зависит другой код);
    • один или несколько клиентов — существующих классов приложения, несовместимых с сервисом из-за неудобного или несовпадающего интерфейса.
  2. Опиши клиентский интерфейс, через который классы приложения смогли бы использовать класс сервиса.
  3. Создай класс адаптера, реализовав этот интерфейс.
  4. Помести в адаптер поле, которое будет хранить ссылку на объект сервиса. Обычно это поле заполняют объектом, переданным в конструктор адаптера. В случае простой адаптации этот объект можно передавать через параметры методов адаптера.
  5. Реализуй все методы клиентского интерфейса в адаптере. Адаптер должен делегировать основную работу сервису.
  6. Приложение должно использовать адаптер только через клиентский интерфейс. Это позволит легко изменять и добавлять адаптеры в будущем.

Преимущества и недостатки паттерна

+ Отделяет и скрывает от клиента подробности преобразования различных интерфейсов.

- Усложняет код программы из-за введения дополнительных классов.