Структурные паттерны
Структурные паттерны описывают, как соединить объекты и интерфейсы, не раскрывая клиенту лишние детали подсистемы.
Карта выбора
| Что требуется | Паттерн |
|---|---|
| Перевести один контракт в другой | Адаптер Adapter |
| Добавлять обязанности комбинацией обёрток | Декоратор Decorator |
| Контролировать доступ к тому же объекту | Заместитель Proxy |
| Дать простой вход в сложную подсистему | Фасад Facade |
| Отделить доменную логику от способа хранения | DAO Data Access Object |
Три похожие обёртки
Adapter
- клиент получает ожидаемый интерфейс;
- внутри выполняется преобразование типов, единиц или ошибок;
- исходный объект имеет несовместимый контракт.
Decorator
- интерфейс сохраняется;
- добавляется функция до или после делегирования;
- несколько декораторов образуют комбинацию обязанностей.
Proxy
- интерфейс также сохраняется;
- основная цель — доступ, ленивость, удалённость, кэш или защита;
- proxy может решить вообще не обращаться к реальному объекту.
Facade и Adapter
Facade проектируют для удобной работы с несколькими участниками подсистемы. Adapter обычно появляется на границе уже существующих несовместимых контрактов. Facade может использовать адаптеры внутри, но причины их появления различаются.
Цена структуры
Каждая обёртка добавляет переход в стеке вызовов. Поэтому при проектировании важно ответить:
- В каком порядке выполняются обёртки?
- Где преобразуются исключения?
- Кто создаёт композицию?
- Как наблюдать реальный путь вызова?
- Сохраняется ли потокобезопасность исходного объекта?
Типичные ошибки
- адаптер содержит бизнес-процесс вместо локального преобразования;
- декоратор зависит от конкретного класса делегата;
- proxy скрывает сетевую задержку контрактом синхронного локального вызова;
- фасад становится единственным «божественным объектом» подсистемы;
- цепочка обёрток собирается в каждой точке использования по-разному.
Для повторения
- Нарисовать направление вызова для Adapter, Decorator и Proxy.
- Объяснить, почему наследование не заменяет произвольную композицию декораторов.
- Назвать ограничения кэширующего proxy.
- Показать место сборки обёрток в приложении.
Навигация: Шаблоны проектирования, Паттерны, Принципы SOLID.