Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Преобразует интерфейс класса в некоторый другой интерфейс, ожидаемый клиентами. Обеспечивает совместную работу классов, которая была бы невозможна без данного паттерна, из-за несовместимости интерфейсов.

Назначение

Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. Адаптер обеспечивает совместную работу классов с несовместимыми интерфейсами, которая без него была бы невозможна.

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

Применяйте паттерн Адаптер, когда:

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

Результаты

Вопросы которые стоит рассмотреть, когда вы решаете применить адаптер:

  • объем работы по адаптации. Адаптеры сильно отличаются по тому объему работы, который необходим для адаптации интерфейса адаптируемого объекта нужному интерфейсу. Это может быть как простейшее преобразование, например изменение имен операций, так и поддержка совершенно другого набора операций. Объем работы зависит от того, насколько сильно отличаются друг от друга интерфейсы целевого и адаптируемого классов.
  • сменные адаптеры. Степень повторной используемости класса тем выше, чем меньше предположений делается о тех классах, которые будут его применять. Встраивая адаптацию интерфейса в класс, вы отказываетесь от предположения, что другим классам станет доступен тот же самый интерфейс.

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

Плюсы

  • позволяет одному адаптеру работать со многими адаптируемыми объектами, т.е. с самим адаптируемым объектом и его подклассами (если таковые имеются). Адаптер может добавить новую функциональность сразу всем адаптируемым объектам;

Минусы

  • затрудняет замещение операций адаптируемого класса. Для этого потребуется породить от адаптируемого класса  подкласс и заставить адаптер ссылаться на этот подкласс а не на сам адаптируемый класс.

Структура

 

Участники

Target - целевой: определяет зависящий от предметной области интерфейс, которым пользуется Client;

Client - клиент: вступает во взаимоотношения с объектами, удовлетворяющими интерфейсу Target;

Adaptee - адаптируемый: определяет существующий интерфейс, который нуждается в адаптации;

Adapter - адаптер: адаптирует интерфейс Adaptee к интерфейсу Target.