Skip to content

Паттерн Adapter (адаптер)

В этой теме мы разберем:

  • суть паттерна;
  • структуру его работы;
  • применимость и шаги реализации паттерна;
  • его отношения с другими паттернами.

Суть паттерна

Adapter (адаптер) — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.

Проблема

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

В какой-то момент мы решаем улучшить приложение, применив стороннюю библиотеку аналитики. Но вот беда — библиотека поддерживает только формат данных JSON, несовместимый с нашим приложением.

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

Решение

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

При этом адаптер оборачивает один из объектов, так что другой объект даже не знает о наличии первого. Например, мы можем обернуть объект, работающий в метрах, адаптером, который конвертирует данные в футы.

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

  1. Адаптер имеет интерфейс, который совместим с одним из объектов.
  2. Поэтому данный объект может свободно вызывать методы адаптера.
  3. Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и в той последовательности, которые понятны второму объекту.

Иногда бывает возможно создать даже двухсторонний адаптер, который работаетв обе стороны.

Таким образом, в приложении биржевых котировок мы могли бы создать класс XML_To_JSON_Adapter, который бы оборачивал объект того или иного класса библиотеки аналитики. Наш код посылал бы адаптеру запросы в формате XML, а адаптер сначала транслировал бы входящие данные в формат JSON, а затем передавал бы их методам обёрнутого объекта аналитики.

Аналогия из жизни

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