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

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

Во-первых, мы создадим интерфейс Months, который должен конвертировать вставленные дни в месяцы:

А теперь создадим реализацию этого интерфейса:

Затем мы создадим интерфейс адаптера, который работает почти так же, как и предыдущий интерфейс, но возвращает не месяцы, а недели:

И его реализация состоит из еще одного частного метода для преобразования месяцев в недели:

И теперь он завершен. Конечно, мы могли бы изменить класс «ConvertMonths», чтобы получить желаемый результат, однако этот паттерн дает возможность сгибать код, не меняя базовый код, а добавляя новые функции. Это повышает гибкость приложения для будущих изменений и упрощает обслуживание.

И теперь это утверждение будет верным:

Как мы видим здесь, адаптер преобразовал дни в недели.

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

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

Код доступен в проекте Github.

Существует еще 6 шаблонов структурного проектирования:

  1. Шаблон проектирования моста
  2. Составной шаблон проектирования
  3. Шаблон проектирования декоратора
  4. Шаблон проектирования фасада
  5. Шаблон проектирования легковеса
  6. Шаблон проектирования прокси