Перейти к основному содержимому

Что это такое

Паттерн Адаптер (Adapter) позволяет классу с неподходящим интерфейсом соответствовать интерфейсу, который ожидает ваш код, — как дорожный переходник между иностранной розеткой и вашим зарядным устройством.

Изменить старый класс нельзя (он взят из библиотеки, или от него зависит другой код). Поэтому вы оборачиваете его в небольшой класс, который реализует нужный вам протокол и преобразует вызовы.


Пример: старый принтер в роли логгера

Нашему коду нужен Logger с методом log(message). Устаревший класс предлагает только write_line(prefix, text). Адаптер хранит старый класс и преобразует один вызов в другой.

Адаптер преобразует вызов

run() работает с любым Logger; адаптер делает устаревший принтер одним из них, не трогая его код.

Prompt
Напишите программу на Python с протоколом Logger (метод log), который ожидает наша функция run, классом LegacyPrinter с другим методом write_line(prefix, text), который нельзя изменить, и классом PrinterAdapter, который соответствует протоколу, преобразуя вызов log в write_line. Запустите сервис с адаптером.
Вывод: полная программа на Python
The adapter translates the call

Когда его использовать

Используйте его, когда работающий код и нужный интерфейс не совпадают, а изменить ни одну из сторон нельзя (или не следует) — сторонние библиотеки, устаревший код, сгенерированный код.

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


Плюсы и минусы

Плюсы: старый и новый код работают вместе без изменений в каждом из них; преобразование находится в одном небольшом классе, который легко тестировать.

Минусы: ещё один шаг, через который приходится читать код; множество адаптеров, наложенных друг на друга, — признак того, что сами интерфейсы нужно переработать.