Описание тега adapter
Согласно книге GoF (стр. 139) цель шаблона проектирования адаптера состоит в следующем:
Преобразование интерфейса класса в другой интерфейс, ожидаемый клиентами. Адаптер позволяет классам работать вместе, что иначе не могло быть из-за несовместимых интерфейсов.
Существует две разные версии шаблона проектирования адаптера (стр. 141).
- Адаптер класса использует множественное наследование для адаптации одного интерфейса к другому.
- Адаптер объекта зависит от композиции объекта.
Существует три сценария, в которых применим шаблон проектирования адаптера (стр. 140).
- вы хотите использовать существующий класс, и его интерфейс не соответствует тому, который вам нужен.
- вы хотите создать повторно используемый класс, который взаимодействует с несвязанными или непредвиденными классами, то есть с классами, которые не обязательно имеют совместимые интерфейсы.
- (только объектный адаптер) вам необходимо использовать несколько существующих подклассов, но нецелесообразно адаптировать их интерфейс, создавая подклассы каждого из них. Адаптер объекта может адаптировать интерфейс своего родительского класса.
В зависимости от используемой версии есть разные последствия применения шаблона проектирования адаптера (стр. 142).
Адаптеры классов и объектов имеют разные компромиссы. Адаптер класса
- адаптирует Adaptee to Target, закрепляясь за конкретным классом Adaptee. Как следствие, адаптер класса не будет работать, когда мы хотим адаптировать класс и все его подклассы.
- позволяет адаптеру переопределять некоторые особенности поведения Adaptee, поскольку Adapter является подклассом Adaptee.
- вводит только один объект, и для доступа к адаптируемому не требуется дополнительных указателей.
Адаптер объекта
- позволяет одному адаптеру работать со многими адаптерами, то есть с самим адаптируемым объектом и всеми его подклассами (если есть). Адаптер также может добавлять функциональные возможности сразу всем адаптерам.
- усложняет преодоление поведения адаптируемого. Для этого потребуется создать подкласс Adaptee и сделать так, чтобы адаптер ссылался на подкласс, а не на сам Adaptee.
Подробные сведения о структуре и реализации шаблона проектирования адаптера см. В следующих онлайн-ресурсах.
Обратите внимание, что тег шаблонов проектирования включает этот шаблон, а также другие 22 шаблона из книги GoF. Рассмотрите возможность использования любых из этих тегов в комбинации, если это применимо.