Название и классификация образца
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Адаптер – паттерн, структурирующий классы и объекты

Назначение

Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. Адаптер обеспечивает совместную работу классов с несовместимыми интерфейсами, которая без него была бы невозможна

Известен также под именем

Wrapper (обертка).

Adapter: применимость

Применяйте адаптер классов, когда:

• хотите использовать существующий класс, но его интерфейс не соответствует вашим потребностям

• собираетесь создать повторно используемый класс, который должен взаимодействовать с заранее неизвестными или не связанными с ним классами, имеющими несовместимые интерфейсы

Применяйте адаптер объектов, когда

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

Adapter (класса): структура

Адаптер класса использует множественное наследование для адаптации одного интерфейса к другому.

Рисунок 10

Adapter ( класса): особенности

• Адаптирует Adaptee к Target, перепоручая действия конкретному классу Adaptee. Поэтому данный паттерн не будет работать, если мы захотим одновременно адаптировать класс и его подклассы;

• Позволяет адаптеру Adapter заместить некоторые операции адаптируемого класса Adaptee, так как Adapter есть не что иное, как подкласс Adaptee;

• Вводит только один новый объект. Чтобы добраться до адаптируемого класса, не нужно никакого дополнительного обращения по указателю.

Adapter (объекта): структура

Адаптер объекта применяет композицию объектов.

Рисунок 11

Adapter (объекта): особенности

• Позволяет одному адаптеру Adapter работать со многими адаптируемыми объектами Adaptee, то есть с самим Adaptee и его подклассами (если таковые имеются). Адаптер может добавить новую функциональность сразу всем адаптируемым объектам;

• Затрудняет замещение операций класса Adaptee. Для этого потребуется породить от Adaptee подкласс и заставить Adapter ссылаться на этот подкласс, а не на сам Adaptee.

Участники

Target (Shape) - целевой - определяет зависящий от предметной области интерфейс, которым пользуется Client.

Client (DrawingEditor) – клиент - вступает во взаимоотношения с объектами, удовлетворяющими интерфейсу Target.

Adaptee (Textview) – адаптируемый - определяет существующий интерфейс, который нуждается в адаптации.

Adapter (Text Shape) – адаптер - адаптирует интерфейс Adaptee к интерфейсу Target.

Реализация

Клиенты вызывают операции экземпляра адаптера Adapter. В свою очередь адаптер вызывает операции адаптируемого объекта или класса Adaptee, который и выполняет запрос. При реализации Адаптера возникает вопрос: откуда объекты-адаптеры узнают, какой экземпляр класса Adaptee вызвать. Существует два подхода к решению:

1) Передать ссылку на объект Adaptee в качестве параметра для конструктора объекта-адаптера или для одного из его методов. Это позволяет использовать объект-адаптер с любым экземпляром или с любым возможным количеством экземпляров класса Adaptee.

2) Сделать класс-адаптер внутренним класом класса Adaptee. При этом упрощается связь между объектом-адаптером и адаптируемым объектом. Кроме того, связт при этом становится жёсткой.

Применени е в Java API

Java API не содержит каких-либо открытых классов адаптеров, готовых к использованию. Он имеет классы, например java.awt.event.WindowAdapter, предназначенные не для прямого использования, а для создания на их основе подклассов. Идея состоит в том, что некоторые интерфейсы слушателей событий, например WindowListener, объявляют множество методов. Как правило, не все эти методы должны быть реализованы, интерес представляют только несколько из них. Класс WindowAdapter реализует интерфейс WindowListener и реализует все его методы как пустые. Класс адаптера, являющийся подклассом класса WindowAdapter должен реализовывать только методы, соответствующие представляющим интерес событиям. Для всех остальных методов он наследует пустые варианты реализации.

Паттерн Bridge.

Дата: 2019-02-25, просмотров: 201.