Структурные паттерны

Структурные паттерны описывают, как соединить объекты и интерфейсы, не раскрывая клиенту лишние детали подсистемы.

Карта выбора

Что требуетсяПаттерн
Перевести один контракт в другойАдаптер Adapter
Добавлять обязанности комбинацией обёртокДекоратор Decorator
Контролировать доступ к тому же объектуЗаместитель Proxy
Дать простой вход в сложную подсистемуФасад Facade
Отделить доменную логику от способа храненияDAO Data Access Object

Три похожие обёртки

Adapter

  • клиент получает ожидаемый интерфейс;
  • внутри выполняется преобразование типов, единиц или ошибок;
  • исходный объект имеет несовместимый контракт.

Decorator

  • интерфейс сохраняется;
  • добавляется функция до или после делегирования;
  • несколько декораторов образуют комбинацию обязанностей.

Proxy

  • интерфейс также сохраняется;
  • основная цель — доступ, ленивость, удалённость, кэш или защита;
  • proxy может решить вообще не обращаться к реальному объекту.

Facade и Adapter

Facade проектируют для удобной работы с несколькими участниками подсистемы. Adapter обычно появляется на границе уже существующих несовместимых контрактов. Facade может использовать адаптеры внутри, но причины их появления различаются.

Цена структуры

Каждая обёртка добавляет переход в стеке вызовов. Поэтому при проектировании важно ответить:

  1. В каком порядке выполняются обёртки?
  2. Где преобразуются исключения?
  3. Кто создаёт композицию?
  4. Как наблюдать реальный путь вызова?
  5. Сохраняется ли потокобезопасность исходного объекта?

Типичные ошибки

  • адаптер содержит бизнес-процесс вместо локального преобразования;
  • декоратор зависит от конкретного класса делегата;
  • proxy скрывает сетевую задержку контрактом синхронного локального вызова;
  • фасад становится единственным «божественным объектом» подсистемы;
  • цепочка обёрток собирается в каждой точке использования по-разному.

Для повторения

  • Нарисовать направление вызова для Adapter, Decorator и Proxy.
  • Объяснить, почему наследование не заменяет произвольную композицию декораторов.
  • Назвать ограничения кэширующего proxy.
  • Показать место сборки обёрток в приложении.

Навигация: Шаблоны проектирования, Паттерны, Принципы SOLID.