Структурные паттерны рассматривают вопросы о компоновке системы на основе классов и объектов. При этом могут использоваться следующие механизмы:
- Наследование, когда базовый класс определяет интерфейс, а подклассы - реализацию. Структуры на основе наследования получаются статичными.
- Композиция, когда структуры строятся путем объединения объектов некоторых классов. Композиция позволяет получать структуры, которые можно изменять во время выполнения.
К структурным шаблонам относятся:
1) Адаптер. Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. Адаптер обеспечивает совместную работу классов с несовместимыми интерфейсами, которая без него была бы невозможна.
Достоинства: Паттерн Adapter позволяет повторно использовать уже имеющийся код, адаптируя его несовместимый интерфейс к виду, пригодному для использования.
Недостатки: Задача преобразования интерфейсов может оказаться непростой в случае, если клиентские вызовы и (или) передаваемые параметры не имеют функционального соответствия в адаптируемом объекте.
2)Декоратор - Динамически добавляет объекту новые обязанности. Является гибкой альтернативой порождению подклассов с целью расширения функциональности.
3)Заместитель. Является суррогатом другого объекта и контролирует доступ к нему.
4) Компоновщик. Компонует объекты в древовидные структуры для представления иерархий часть-целое. Позволяет клиентам единообразно трактовать индивидуальные и составные объекты.
Достоинства паттерна Composite:
- В систему легко добавлять новые примитивные или составные объекты, так как паттерн Composite использует общий базовый класс Component.
- Код клиента имеет простую структуру – примитивные и составные объекты обрабатываются одинаковым образом.
- Паттерн Composite позволяет легко обойти все узлы древовидной структуры.
Недостатки паттерна Composite:
- Неудобно осуществить запрет на добавление в составной объект Composite объектов определенных типов.
5)Мост. Отделяет абстракцию от ее реализации так, чтобы то и другое можно было изменять независимо.
Достоинства паттерна Bridge:
- Проще расширять систему новыми типами за счет сокращения общего числа родственных подклассов.
- Возможность динамического изменения реализации в процессе выполнения программы.
- Паттерн Bridge полностью скрывает реализацию от клиента. В случае модификации реализации пользовательский код не требует перекомпиляции.
6)Приспособленец. Использует разделение для эффективной поддержки множества мелких объектов.
7)Фасад. Предоставляет унифицированный интерфейс вместо набора интерфейсов некоторой подсистемы. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы.