Структурные шаблоны проектирования: Adapter

В структурных шаблонах проектирования рассматривается вопрос о том, каким образом из классов и объектов формируются более крупные структуры. Иными словами, структурные шаблоны, как правило, связаны с композицией объектов и с тем, как именно сущности могут использовать друг друга. По сути, они помогают узнать ответ на вопрос «Как создать программный компонент?» Один из таких шаблонов — «Адаптер» (Adapter).

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

Давайте представим, что на карте памяти существуют фотографии, которые мы хотим перенести на наш ПК. Чтобы выполнить данную задачу, понадобится некий адаптер, совместимый с портами персонального компьютера. К примеру, пусть адаптером будет карт-ридер. Или же давайте вспомним ситуацию, когда в обычную розетку советских времен нельзя было вставить вилку, в простонародье именуемую «евро». Проблема решалась как установкой новых розеток, соответствующих евростандарту, так и более простым способом, который заключался в применении простейшего переходника. Ну и в качестве более понятного примера можно привести опытного переводчика, который обеспечивает коммуникацию между двумя людьми, не понимающими друг друга без посторонней помощи.

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

Как это выглядит в коде

Допустим, мы разрабатываем игру, где охотник охотится на львов.

Поначалу у нас есть интерфейс Lion, реализующий всех львов:

На любую реализацию Lion-интерфейса охотится Hunter:

Теперь представьте, что надо добавить в игру WildDog, чтобы Hunter _смог охотиться и на нее. Но сделать это напрямую нельзя, ведь _WildDog -- это другой интерфейс. Для обеспечения совместимости нам и пригодится адаптер:

Осталось рассмотреть способ применения:

Также вам может быть интересен пример на Java: https://github.com/iluwatar/java-design-patterns/tree/master/adapter.

По материалам статьи «Design Patterns for Humans» — https://github.com/kamranahmedse/design-patterns-for-humans.