1.49M
Category: programmingprogramming

Структурные паттерны проектирования - Паттерн Adapter

1.

ГЛАВА 4
Паттерн Adapter

2.

01
Что такое структурные паттерны?
Определение
Структурные паттерны рассматривают вопрос о том, как из классов и объектов
образуются более крупные структуры. Они определяют способы композиции
объектов для получения новой функциональности.
Уровень класса
Используют наследование для
составления композиций из
интерфейсов и реализаций.
Уровень объекта
Компонуют объекты для
получения новой
функциональности.

3.

02 Паттерн Adapter: назначение
Назначение
Преобразует интерфейс одного класса в интерфейс другого, который
ожидают клиенты. Адаптер обеспечивает совместную работу классов
с несовместимыми интерфейсами.
Альтернативное название
Wrapper
Классификация
Структурный паттерн
Аналогия из жизни
Когда применять:
Хотите использовать существующий класс, но его интерфейс не
соответствует вашим потребностям
Создаете повторно используемый класс, который должен
взаимодействовать с неизвестными классами
Нужно использовать несколько существующих подклассов
(только для адаптера объектов)
Адаптер электропитания
позволяет подключить
европейскую вилку к
американской розетке —
преобразует один интерфейс
в другой.

4.

03
Мотивация: проблема несовместимых интерфейсов
Пример: Графический редактор
Графический редактор позволяет рисовать графические элементы (линии, многоугольники, текст) и
организовывать их в картинки.
Интерфейс графических объектов определяется абстрактным классом Shape, а редактор создает подклассы
для каждого вида объектов, включая TextShape для текста. Однако TextShape сложен в реализации.
Проблема
Класс TextView из сторонней библиотеки имеет
несовместимый интерфейс с Shape. Невозможно
использовать TextView напрямую в редакторе.
Два подхода
1
Адаптер класса
2
Адаптер объекта
Множественное наследование
Композиция объектов
Решение
Создать класс
TextShape, который
адаптирует
интерфейс TextView
к интерфейсу Shape.
На этой диаграмме показан адаптер объекта.

5.

04 Структура паттерна Adapter
Адаптер класса
использует множественное
наследование для адаптации одного
интерфейса к другому
Адаптер объекта
применяет композицию
объектов

6.

05 Участники паттерна
Target
(Shape)
Целевой класс. Определяет зависящий от предметной
области интерфейс, которым пользуется Client.
Adaptee
(TextView)
Адаптируемый класс. Определяет существующий
интерфейс, который нуждается в адаптации.
Client
(DrawingEditor)
Клиент. Вступает во взаимоотношения с объектами,
удовлетворяющими интерфейсу Target.
Adapter
(TextShape)
Адаптер. Адаптирует интерфейс Adaptee к
интерфейсу Target.

7.

06
Адаптер класса vs Адаптер объекта
Адаптер класса
Преимущества
Может замещать операции Adaptee
Вводит только один новый объект
Нет дополнительного обращения по указателю
Ограничения
Не работает с подклассами Adaptee
Требует множественного наследования
Адаптер объекта
Преимущества
Работает с Adaptee и его подклассами
Более гибкий подход
Добавляет функциональность всем объектам
Ограничения
Затрудняет замещение операций Adaptee
Требуется дополнительное обращение по
указателю
Вывод: Адаптер объекта более гибкий и предпочтителен в большинстве случаев, особенно когда нужно
работать с подклассами.

8.

09 Результаты применения паттерна
Преимущества
Повторное использование
Известные применения
ET++Draw
Интеграция библиотек
Interviews 2.6
Стабильность API
ObjectWorks\Smalltalk
NeXT AppKit
Вопросы для рассмотрения
1 Объем работы по адаптации
Практические сферы
2 Сменные адаптеры (pluggable)
3 Двусторонние адаптеры
• Интеграция legacy-систем
• Работа с сторонними API
• Нормализация данных
• Адаптация форматов (XML ↔ JSON)

9.

10 Родственные паттерны
Bridge
Мост
Структура аналогична адаптеру,
но иное назначение. Отделяет
абстракцию от реализации,
чтобы они могли изменяться
независимо.
Отличие: Мост проектируется
заранее, адаптер применяется к
существующему коду.
Decorator
Proxy
Декоратор
Заместитель
Расширяет функциональность
объекта, изменяя его интерфейс.
Более прозрачен для
приложения, чем адаптер.
Определяет представителя или
суррогат другого объекта, но не
изменяет его интерфейс.
Особенность: Поддерживает
рекурсивную композицию, что для
адаптеров невозможно.
Отличие: Proxy сохраняет
интерфейс, адаптер его
преобразует.
Ключевое понимание
Все три паттерна имеют схожую структуру (объект ссылается на другой объект), но разное
назначение и семантику. Правильный выбор зависит от задачи: адаптация интерфейса,
расширение функциональности или контроль доступа.

10.

Тест
1. Какова основная цель паттерна Adapter?
A. Упростить создание сложных объектов
B. Преобразовать интерфейс одного класса в интерфейс, ожидаемый клиентом
C. Гарантировать существование только одного экземпляра класса
D. Динамически добавлять объекту новые обязанности
2. Какие два основных типа Adapter существуют согласно GoF?
A. Адаптер класса и адаптер объекта
B. Адаптер интерфейса и адаптер реализации
C. Адаптер наследования и адаптер композиции
D. Простой адаптер и сложный адаптер
3. В чем основное различие между адаптером класса и адаптером объекта?
A. Адаптер класса использует композицию, адаптер объекта — наследование
B. Адаптер класса может работать с несколькими адаптируемыми объектами
одновременно, адаптер объекта — только с одним
C. Адаптер класса использует наследование, адаптер объекта — композицию
D. Адаптер класса проще реализовать на C#, адаптер объекта — на Java
English     Русский Rules