Паттерн Adapter (Wrapper).pptx
- Количество слайдов: 11
Паттерн Adapter (Wrapper) Паламарчук Ирина, Пучина Наталя ПМ-09 -2
Название и назначение Название: Адаптер – паттерн, структурирующий классы и объекты. . Назначение: Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. Адаптер обеспечивает совместную работу классов с несовместимыми интерфейсами, которая без него была бы невозможна. Два типа: Class Adapter и Object Adapter.
Диаграмма Рис. 1
Пример кода class Shape { public: Shape(); virtual void Bounding. Box( Points bottom. Left, Point& top. Right); virtual Manipulator* Create. Manipulator(); }; class Text. View { public: Text. View(); void Get. Origin(Coord& x, Coords y) ; void Get. Extent(Coord& width, Coords height); virtual bool Is. Empty(); }; class Text. Shape : public Shape, private Text. View { public: Text. Shape(); virtual void Bounding. Box( Point& bottom. Left, Points top. Right); virtual bool Is. Empty() ; virtual Manipulator* Create. Manipulator(); };
Пример кода void Text. Shape: : Bounding. Box ( Points bottom. Left, Point& top. Right) const { Coord bottom, left, width, height; Get. Origin(bottom, left); Get. Extent(width, height); bottom. Left = Point(bottom, left); top. Right = Point(bottom + height, left + width); } bool Text. Shape: : Is. Empty () { return Text. View: : Is. Empty(); } Manipulator* Text. Shape: : Create. Manipulator () { return new Text. Manipulator(this); }
Применимость Применяйте паттерн адаптер, когда: • Хотите использовать существующий класс, но его интерфейс не соответствует вашим потребностям. • Собираетесь создать повторно используемый класс, который должен взаимодействовать с заранее неизвестными ли не связанными с ним классами, имеющими несовместимые интерфейсы. • Нужно использовать несколько существующих подклассов, но непрактично адаптировать их интерфейсы путем порождения новых подклассов от каждого. В этом случае адаптер объектов может приспосабливать интерфейс их общего родительского класса.
Структура Рис. 2 Адаптер класса Рис. 3 Адаптер объекта
Плюсы адаптера • инкапсуляция реализации внешних классов (компонентов, библиотек), система становится независимой от интерфейса внешних классов; • переход на использование других внешних классов не требует переделки самой системы, достаточно реализовать один класс Adapter.
Результаты • Адаптер класса: 1. Адаптирует Adaptee к Target, перепоручая действия конкретному классу Adaptee. 2. Позволяет адаптеру Adapter заместить некоторые операции адаптируемого класса Adaptee, так как Adapter есть не что иное, как подкласс Adaptee. 3. Вводит только один новый объект. • Адаптер объектов: 1. Позволяет одному адаптеру Adapter работать со многим адаптируемыми объектами Adaptee, то есть с самим Adaptee и его подклассами. 2. Затрудняет замещение операций класса Adaptee. Для этого потребуется породить от Adaptee подкласс и заставить Adapter ссылаться на этот подкласс, а не на сам Adaptee.
Родственные паттерны Мост Структура паттерна мост аналогична структуре адаптера, но у моста иное назначение. Он отделяет интерфейс от реализации, чтобы то и другое можно было изменять независимо. Адаптер же призван изменить интерфейс существующего объекта. Декоратор Паттерн декоратор расширяет функциональность объекта, изменяя его интерфейс. Таким образом, декоратор более прозрачен для приложения, чем адаптер. Как следствие, декоратор поддерживает рекурсивную композицию, что для «чистых» адаптеров невозможно. Фасад Он является близким к адаптеру, не всегда можно отличить один от другого. Разница состоит в том, что шаблон Фасад предназначен для упрощения интерфейса, тогда как шаблон Адаптер предназначен для приведения различных существующих интерфейсов к единому требуемому виду.
Вопросы • Для чего нужен паттерн адаптер: 1. Для определения интерфейса для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. 2. Для обеспечения совместной работы классов с несовместимыми интерфейсами, которая без него была бы невозможна. 3. Задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа. • Когда нужно использовать паттерн адаптер: 1. когда хотите использовать существующий класс, но его интерфейс не соответствует вашим потребностям. 2. когда алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой; 3. когда собираетесь создать повторно используемый класс, который должен взаимодействовать с заранее неизвестными ли не связанными с ним классами, имеющими несовместимые интерфейсы. • Какие паттерны являются родственными для паттерна Адаптер: 1. Паттерн Abstract Factory 4. Паттерн Decorator 2. Паттерн Bridge 5. Паттерн Composite 3. Паттерн Proxy 6. Паттерн Facade