Паттерн Adapter (адаптер)
В этой теме мы разберем:
- суть паттерна;
- структуру его работы;
- применимость и шаги реализации паттерна;
- его отношения с другими паттернами.
Суть паттерна
Adapter (адаптер) — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Проблема
Представь, что мы делаем приложение для торговли на бирже. Наше приложение скачивает биржевые котировки из нескольких источников в XML, а затем рисует красивые графики.
В какой-то момент мы решаем улучшить приложение, применив стороннюю библиотеку аналитики. Но вот беда — библиотека поддерживает только формат данных JSON, несовместимый с нашим приложением.
Мы могли бы переписать библиотеку, чтобы та поддерживала формат XML. Но, во-первых, это может нарушить работу существующего кода, который уже зависит от библиотеки. А во-вторых, у нас может просто не быть доступа к её исходному коду.
Решение
Мы можем создать адаптер. Это объект-переводчик, который трансформирует и представляет интерфейс или данные одного объекта в таком виде, в котором они станут понятны другому объекту.
При этом адаптер оборачивает один из объектов, так что другой объект даже не знает о наличии первого. Например, мы можем обернуть объект, работающий в метрах, адаптером, который конвертирует данные в футы.
Адаптеры могут не только переводить данные из одного формата в другой, но и помогать объектам с разными интерфейсами работать сообща. Это работает так:
- Адаптер имеет интерфейс, который совместим с одним из объектов.
- Поэтому данный объект может свободно вызывать методы адаптера.
- Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и в той последовательности, которые понятны второму объекту.
Иногда бывает возможно создать даже двухсторонний адаптер, который работаетв обе стороны.
Таким образом, в приложении биржевых котировок мы могли бы создать класс XML_To_JSON_Adapter, который бы оборачивал объект того или иного класса библиотеки аналитики. Наш код посылал бы адаптеру запросы в формате XML, а адаптер сначала транслировал бы входящие данные в формат JSON, а затем передавал бы их методам обёрнутого объекта аналитики.
Аналогия из жизни
Когда мы в первый раз летим за границу, нас может ждать сюрприз при попытке зарядить ноутбук, потому что стандарты розеток в разных странах различаются. Наша европейская зарядка будет бесполезна в США без специального адаптера, позволяющего подключиться к розетке другого типа.